我有两个名为users&Inbox的表开关
在Inbox表中,我有一个名为sender_id的列,其中包含发件人的user_id
我想在视图中显示此消息。我需要一个查询从inbox表中获取sender_id,并使用它从users表中选择某个用户
我需要对所有消息和所有用户执行此操作。

最佳答案

当你使用口才时,拉维基本上是向前走的。你可以随时定制它。
首先,几乎所有的时间,我创建一个模型,同时使用这个:php artisan make:model Something --migration
我知道您已经制作了一些模型和/或迁移,但我将一步一步地帮助您理解它。
所以,在你的情况下,它将是php artisan make:model User --migrationphp artisan make:model Inbox --migration。这样,您将得到两个名为UserInbox的模型,以及两个名为date_create_users_table.phpdate_create_inboxs_table.php的迁移。也许您已经使用php artisan make:auth创建了默认用户表。如果是这样,不要重拍。
我不确定laravel会如何命名收件箱模型迁移。。。因为,我认为,拉弗5.3,多聚体改变了,不总是在最后加一个“S”。
然后,现在您有了模型和迁移,让我们在迁移文件中添加一些行。因为你想建立一对多的关系。你不需要触摸用户。只有收件箱迁移。每个收件箱都与一个用户相关,用户可以有多个收件箱。在迁移中添加以下内容:

public function up()
{
    Schema::create('inboxs', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id');
        $table->foreign('user_id')->references('id')->on('users');
        all other columns...
    });
}

在那里,如果需要发件人、收件人等,可以更改列的名称。。。请改为:
public function up()
{
    Schema::create('inboxs', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('sender_id');
        $table->foreign('sender_id')->references('id')->on('users');
        $table->integer('recipient_id');
        $table->foreign('recipient_id')->references('id')->on('users');
        all other columns...
    });
}

我们刚才所做的,就是创建外键,Laravel将使用它来构建查询。在有趣的部分之前还有最后一部分。我们需要在模型中创建关系。从用户开始:
App/User.php软件
public function inboxs() {
    return $this->hasMany(Inbox::class);
}

现在进入App/Inbox.php模型:
public function user() {
    return $this->belongsTo(User::class);
}

如果需要发件人/收件人等。。。改为往这边走:
public function sender() {
    return $this->belongsTo(User::class);
}

public function recipient() {
    return $this->belongsTo(User::class);
}

请注意,每个函数都需要以与迁移相同的方式写入。sender_id需要一个名为sender()的关系。
现在,我们的关系结束了,我们可以用雄辩的口才来称呼一切。
$inboxs = Inbox::with('sender')->get();

这将把所有收件箱的数组返回到inboxs表中。您可以通过以下方式访问发件人:$inboxs[0]->sender();
您需要id,请执行以下操作:$sender_id = $inboxs[0]->sender_id;
发件人姓名:$sender_name = $inboxs[0]->sender->name;
如果你想得到一个收件箱并且你有这个id,那么就这样做$inbox = Inbox::with('sender')->find($id);
这样就不会得到一个数组,只有一个结果,并且可以使用$sender_name = $inbox->sender->name;直接访问发送者,而不必添加[0]或使用foreach循环。
您可以使用以下方法获取用户发送的所有邮件:
$inboxs = Inbox::where('sender_id', $sender_id)->get();

最后,可以使用以下方法将数据传递到视图:
return view('path.to.view')->with('inbox',$inbox);

在视图中显示发件人的姓名:
//If view.blade.php
{{$inbox['sender']['name']}} //work a 100%
{{$inbox->sender->name}} //I'm not sure about this one

//If not using blade
<?php echo $inbox['sender']['name']; ?>

有很多事情你可以做使用雄辩,你可以添加很多条件,你想。如果你想使用雄辩的语言,我建议你做的唯一一件事就是注意n+1问题。There is a link where I explain it。找我答案的编辑部分。
如果您需要一些文档:
Laravel 5.3 Relationships
Laravel 5.3 Migrations
Laravel 5.3 Eloquent

10-06 11:34