如何解决Laravel 7从表中进行选择,其中两列具有来自单个表的ID
我的要求?
如果我是ID = 1的登录用户,那么我想通过消息表从用户表中选择向其发送消息或从中发送消息的用户我收到了谁消息。
表1:用户
+----+------+-------+
| id | name | email |
+----+------+-------+
| 1 | a | ??? |
| 2 | b | ??? |
| 3 | c | ??? |
| 4 | d | ??? |
| 5 | e | ??? |
| 6 | f | ??? |
| 7 | g | ??? |
| 8 | h | ??? |
| 9 | i | ??? |
| 10 | j | ??? |
+----+------+-------+
表2:消息
+----+---------+-------------+
| id | user_id | receiver_id |
+----+---------+-------------+
| 1 | 1 | 2 |
| 2 | 3 | 1 |
| 3 | 4 | 1 |
| 4 | 1 | 5 |
| 5 | 1 | 3 |
+----+---------+-------------+
用户模型
public function messages()
{
return $this->belongsToMany(User::class,'messages','user_id','receiver_id');
}
消息模型
public function user()
{
return $this->belongsTo(User::class);
}
那我到目前为止已经尝试了什么?
$id = Auth::id();
$users = User::with(['messages' => function($query) use($id){
$query->where('user_id',$id)
->orWhere('received_id',$id)
->orderBy('created_at','DESC');
}])->get();
dd($users);
预期结果是什么?
使用此查询,我获得了所有10个用户。虽然我只能获得4个用户(ID为2,3,4,5的用户)。
如果上面的查询是错误的,或者我应该遵循另一种方法,或者我应该创建某种关系,请帮助。
希望您已经理解了这个问题,我是Laravel的新手,但我正在学习。
解决方法
您可能需要的是User模型中的三个关系(一对多)。一种用于已发送消息,一种用于已接收消息,另一种用于两种消息,如下所示:
public function messagesSent()
{
return $this->hasMany(Message::class,'user_id');
}
public function messagesReceived()
{
return $this->hasMany(Message::class,'receiver_id');
}
public function messages()
{
return $this->messagesSent()->union($this->messagesReceived()->toBase());
}
然后,您应该能够获得以下用户消息:User::with('messages')->get();
我认为您应该使用join语句或“ whereHas”来选择有任何消息的用户。
$id = Auth::id();
$users = User::whereHas('messages',function ($query) use($id){
$query->where('user_id',$id)
->orWhere('received_id',$id);
})
->get();
要访问“消息”,您也应该添加“ with”语句。
,为此问题添加我自己的解决方案(即正在工作)。
用户模型
public function sent()
{
return $this->hasMany(Message::class,'user_id');
}
public function received()
{
return $this->hasMany(Message::class,'receiver_id');
}
查询
$users = User::whereHas('sent',function ($query) use($id) {
$query->where('receiver_id',$id);
})->orWhereHas('received',function ($query) use($id) {
$query->where('user_id',$id);
})->get();
dd($users);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。