在另一个 table 和 laravel 查询构建器中使用列值
Use a column value in an other table with laravel query builder
我有两个 table 命名用户和收件箱
在收件箱 table 中,我有一个名为 sender_id
的列,其中包含发件人 user_id
我想在视图中显示此消息。我需要查询以从收件箱 table 中获取 sender_id
并将其用于 select 来自用户 table 的某个用户
我需要对所有消息和所有用户执行此操作。
我认为你应该像这样更新你的代码:
$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);
希望这对你有用!
模型中:
命名空间应用;
使用Illuminate\Database\Eloquent\Model;
class 消息扩展模型
{
保护 $table = 'table_name';
public function sender()
{
return $this->belongsTo('App\User', 'sender_id', 'id');
}
}
在控制器中:
public函数函数名($user_id){
$messages = Messages::where('sender_id', $user_id)->get();
return view("view.path")
->with('messages',$messages);
}
在视图中,您可以像这样访问 seder 详细信息 $message->sender->name for name for id $message->sender->id
当您使用 eloquent 时,Laravel 基本上是直截了当的。您可以随时对其进行自定义。
首先,几乎所有的时间,我都使用这个同时创建模型和迁移:php artisan make:model Something --migration
我知道您已经进行了一些模型 and/or 迁移,但我会逐步帮助您理解它。
因此,在您的情况下,它将是 php artisan make:model User --migration
和 php artisan make:model Inbox --migration
。这样做,您将获得两个名为 User
和 Inbox
的模型以及两个名为 date_create_users_table.php
和 date_create_inboxs_table.php
的迁移。也许您已经用 php artisan make:auth
设置了默认用户 table。如果是这样,请不要重制。
我不确定 laravel 将如何命名收件箱模型迁移...因为,我认为,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);
}
如果您需要 Sender/Recipient/etc... 请改为:
public function sender() {
return $this->belongsTo(User::class);
}
public function recipient() {
return $this->belongsTo(User::class);
}
请注意,您的每个函数都需要以与迁移相同的方式编写。 sender_id
需要一个名为 sender()
.
的关系
现在,我们的关系已经完成,我们可以简单地使用 eloquent 调用所有内容。
$inboxs = Inbox::with('sender')->get();
这会将 return 您所有收件箱的数组放入收件箱 table。您可以通过以下方式访问发件人:$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
我有两个 table 命名用户和收件箱
在收件箱 table 中,我有一个名为 sender_id
的列,其中包含发件人 user_id
我想在视图中显示此消息。我需要查询以从收件箱 table 中获取 sender_id
并将其用于 select 来自用户 table 的某个用户
我需要对所有消息和所有用户执行此操作。
我认为你应该像这样更新你的代码:
$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);
希望这对你有用!
模型中:
命名空间应用;
使用Illuminate\Database\Eloquent\Model;
class 消息扩展模型 { 保护 $table = 'table_name';
public function sender()
{
return $this->belongsTo('App\User', 'sender_id', 'id');
}
}
在控制器中:
public函数函数名($user_id){
$messages = Messages::where('sender_id', $user_id)->get();
return view("view.path")
->with('messages',$messages);
}
在视图中,您可以像这样访问 seder 详细信息 $message->sender->name for name for id $message->sender->id
Laravel 基本上是直截了当的。您可以随时对其进行自定义。
首先,几乎所有的时间,我都使用这个同时创建模型和迁移:php artisan make:model Something --migration
我知道您已经进行了一些模型 and/or 迁移,但我会逐步帮助您理解它。
因此,在您的情况下,它将是 php artisan make:model User --migration
和 php artisan make:model Inbox --migration
。这样做,您将获得两个名为 User
和 Inbox
的模型以及两个名为 date_create_users_table.php
和 date_create_inboxs_table.php
的迁移。也许您已经用 php artisan make:auth
设置了默认用户 table。如果是这样,请不要重制。
我不确定 laravel 将如何命名收件箱模型迁移...因为,我认为,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);
}
如果您需要 Sender/Recipient/etc... 请改为:
public function sender() {
return $this->belongsTo(User::class);
}
public function recipient() {
return $this->belongsTo(User::class);
}
请注意,您的每个函数都需要以与迁移相同的方式编写。 sender_id
需要一个名为 sender()
.
现在,我们的关系已经完成,我们可以简单地使用 eloquent 调用所有内容。
$inboxs = Inbox::with('sender')->get();
这会将 return 您所有收件箱的数组放入收件箱 table。您可以通过以下方式访问发件人:$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