在laravel查询构建器的其他表中使用列值

时间:2017-01-31 09:51:27

标签: mysql laravel laravel-5.3 query-builder laravel-query-builder

我有两个名为用户的表女巫&收件箱

在收件箱表格中,我有一个名为sender_id的列,其中包含发件人的user_id

我想在视图中显示此消息。我需要一个查询来从收件箱表中获取sender_id并使用它来从users表中选择某个用户 我需要对所有消息和所有用户执行此操作。

3 个答案:

答案 0 :(得分:0)

我认为你应该更新你的代码:

$user_messages = DB::table('messages')
                   ->select('messages.id as msgId','messages.message as message','users.id as userId','users.user_name as user_name')
                   ->join('messages','messages.user_id','=','users.id')
                   ->where('messages.user_id',$user_id)
                   ->get();

return view("view.path")
           ->with('messages',$user_messages);

希望这对你有用!

答案 1 :(得分:0)

在模特:

命名空间App;

使用Illuminate \ Database \ Eloquent \ Model;

类消息扩展了Model {     protected $ table =' table_name';

public function sender()
{
    return $this->belongsTo('App\User', 'sender_id', 'id');
}

}

在控制器中:

public function functionName($ user_id){

$messages = Messages::where('sender_id', $user_id)->get();

return view("view.path")
        ->with('messages',$messages);

}

在视图中,您可以访问seder详细信息,例如此$ message-> sender-> name for name $ message-> sender-> id

答案 2 :(得分:0)

当你使用雄辩的时候,Laravel基本上是一种狂热的态度。您可以随时自定义它。

首先,几乎所有时间,我都使用以下方法同时创建模型和迁移: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将如何命名收件箱模型迁移...因为,我认为,Laravel 5.3,更改了plurialisation,并不总是在最后添加“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用于构建查询的外键。在乐趣之前还有最后一部分。我们需要在模型中创建关系。从用户开始:

应用/ 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[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']; ?>

使用Eloquent可以做很多事情,你可以添加你想要的条件。如果您想使用Eloquent,我建议您真正做的唯一事情,请注意n + 1问题。 There is a link where I explain it。请查看我的答案的编辑部分。

如果您需要一些文件:
Laravel 5.3 Relationships
Laravel 5.3 Migrations
Laravel 5.3 Eloquent