我正在为我的应用程序开发消息系统,目前,我有两个表:
1) 消息表:
Schema::create('messages', function (Blueprint $table) {
$table->increments('id');
$table->text('subject');
$table->integer('sender_id');
$table->text('body');
$table->timestamps('create_date');
$table->integer('sent_to_id');
});
2) 用户表:
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
目前,我可以将消息及其主题存储到 messages 表中。现在,我想选择要向其发送消息的用户的 id。这样我就可以用它来创建对话。
有什么方法可以列出所有用户并选择我想向其发送消息的首选用户?或者有消息传递技术的人可以帮忙吗?
最佳答案
您的问题有点含糊且过于宽泛。无论如何,我假设您想让用户能够向系统中的其他现有用户发送消息。
在我们开始之前,请注意涉及很多设计决策。我将简单地采用最简单和最快捷的方法,因为它只是一个让您入门的演示。
为了使用户能够相互发送消息,您需要在数据库迁移中设置外键,设置 Eloquent 关系并创建要在 Controller 类中使用的辅助方法。
非常不言自明;但如果您不知道我在说什么,请查看 documentation on foreign key constraints .
您的 users 表迁移暂时不需要更改,所以我跳到 messages 表迁移:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateMessagesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('messages', function (Blueprint $table) {
$table->increments('id');
$table->integer('sender_id');
$table->integer('sent_to_id');
$table->text('body');
$table->text('subject');
// It's better to work with default timestamp names:
$table->timestamps();
// `sender_id` field referenced the `id` field of `users` table:
$table->foreign('sender_id')
->references('id')
->on('users');
// Let's add another foreign key on the same table,
// but this time fot the `sent_to_id` field:
$table->foreign('sent_to_id')
->references('id')
->on('users');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('messages');
}
}
如评论所述,这会在您的 messages 表上设置外键约束。不要忘记:php artisan migrate:refresh [-seed]。
首先,看一下 documentation on eloquent relationships .然后看看我们如何设置你的两个模型之间的关系; 消息 和用户。
这是您的 App\Message 类:
<?php
namespace App;
use App\User;
use Illuminate\Database\Eloquent\Model;
class Message extends Model
{
protected $fillable = ['body', 'subject', 'sent_to_id', 'sender_id'];
// A message belongs to a sender
public function sender()
{
return $this->belongsTo(User::class, 'sender_id');
}
// A message also belongs to a receiver
public function receiver()
{
return $this->belongsTo(User::class, 'sent_to_id');
}
}
还有你的 App\User 类:
<?php
namespace App;
use App\Message;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
protected $fillable = ['name', 'email', 'password'];
// A user can send a message
public function sent()
{
return $this->hasMany(Message::class, 'sender_id');
}
// A user can also receive a message
public function received()
{
return $this->hasMany(Message::class, 'sent_to_id');
}
}
有了这些文件,您将拥有一个可靠的 API 供您使用。看看这些例子:
$user->sent // All messages sent by this user
$user->received // All messages received by this user
App\User::has('sent')->get() // Retrieve all users that have at lest one sent message
App\User::has('sent', '>', 2)->get()
$user->sent()->where('subject', 'Happy new year!')->first();
有关更多示例,请参阅文档或在 php artisan tinker 中使用它们,看看它有多强大。
现在您已准备好迁移和模型。您需要利用它们来实现您的用户间消息传递系统。
这需要很多样板代码,例如路由、 Controller 和 View ,我不会在这里写下来。但我相信你能找到自己的出路。我只是在这里添加一个示例用法示例。
我假设您需要一个 Controller 来让用户向另一个用户发送消息。这是一个例子:
<?php
namespace App\Http\Controllers;
use Auth;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ConversationController extends Controller
{
public function sendMessage(Request $request)
{
// Do the validation...
// Send the message from the current user to the user with ID of 1,
// You probably always want the current logged-in user as the sender.
// We talk about the recipient later...
//
Auth::user()->sent()->create([
'body' => $request->body,
'subject' => $request->subject,
'sent_to_id' => 1,
]);
// Set flash message, render view, etc...
}
}
这将从登录用户发送一条消息给 ID 为 1 的用户。您的问题主要是关于收件人以及如何列出用户并从中进行选择。我们稍后再讲。
这行得通,但不是很干净。让我们将逻辑包装在模型方法中:
class User extends Authenticatable
{
// ...
public function sendMessageTo($recipient, $message, $subject)
{
return $this->sent()->create([
'body' => $message,
'subject' => $subject,
'sent_to_id' => $recipient,
]);
}
}
将此方法添加到您的 App\User 模型并让您的 Controller 代码如下:
Auth::user()->sendMessageTo(1, $request->subject, $request->body);
更好,对吧?
唯一剩下的问题是关于收件人 ID。您可能有一个用户用来撰写消息的表单。它可能有一个名为 body 的文本区域和名为 subject 的主题输入。您只需要另一个输入,以便用户也可以传递收件人用户的 ID。然后你就说:
Auth::user()->sendMessageTo($request->recipient, $request->subject, $request->body);
您可能想要使用列出用户名称的下拉列表(或自动完成小部件)。呈现表单时,您可以将用户数据添加到 View 中,如下所示:
<?php
namespace App\Http\Controllers;
use Auth;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ConversationController extends Controller
{
public function composeMessage()
{
// ...
// Get a collection of `[id => name]` probable recipients,
// so that the logged-in user can choose from. Note that
// you probably want to exclude the current user herself
// from the list.
$users = User::where('id', '!=', Auth::id())->pluck('name', 'id');
return view('view.name', compact('users'));
}
}
然后,在您的 View 中,您可以像这样呈现此数据:
{{ Form::select('recipient', $users) }}
// See: https://laravelcollective.com/docs/5.3/html
简单吧?这是未经测试的代码,但希望它能给您启发。
毕竟,为什么不使用设计良好、测试良好的消息包呢?见面Laravel Messenger .
关于php - Laravel 用户间消息系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41547856/
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas
我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
如果我在模型中设置验证消息validates:name,:presence=>{:message=>'Thenamecantbeblank.'}我如何让该消息显示在闪光警报中,这是我迄今为止尝试过的方法defcreate@message=Message.new(params[:message])if@message.valid?ContactMailer.send_mail(@message).deliverredirect_to(root_path,:notice=>"Thanksforyourmessage,Iwillbeintouchsoon")elseflash[:error]
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc