Php 通过计算laravel中的孙子对象来检索子对象
我有两个模型,Php 通过计算laravel中的孙子对象来检索子对象,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我有两个模型,User和Conversation相互关联,具有多对多关系,多个用户对多个对话 在我的模型上,我有: 用户: public function conversation() { return $this->belongsToMany('App\Models\Conversation'); } 对话: public function users() { return $this->belongsToMany('App\Models\User'); } 因
User
和Conversation
相互关联,具有多对多关系,多个用户对多个对话
在我的模型上,我有:
用户
:
public function conversation() {
return $this->belongsToMany('App\Models\Conversation');
}
对话
:
public function users() {
return $this->belongsToMany('App\Models\User');
}
因此,我可以通过以下方式获得用户的对话:$user->conversation
反之亦然,通过$conversation->users
检索对话中的用户,就像一个符咒。问题是,我需要一种方法来检索某个用户以前联系过的所有用户,简单地说,类似于:
$user = User::find(1);
$talkedUsers = $user->conversation->user.
以及检查用户“x”与用户“y”进行的所有对话的方法(“如果有”)
显然,上面的代码不起作用。我想知道这样的事情是否可以在不添加复杂原始查询的情况下完成,我希望只使用QueryBuilder
问题是,我需要一种方法来检索所有用户和某个用户
已经联系过了,
$user->conversation
实际上是一组对话,最好使用复数,即$user->conversations
。然后可以使用高阶消息一次处理多个对象。有关更多信息,请参阅
$users = $user->conversations->flatMap->users->unique('id');
flatMap
将从多个Conversation
对象检索的多个User
集合合并到一个User
对象集合中,然后要删除重复的用户,可以使用unique('id')
也是一种检查用户“x”与的所有对话的方法
用户“y”(“如果有”)
首先,您应该从x查询所有对话,然后只筛选与y有关系的对话
$userX = User::find($x);
$conversations = $userX->conversations()
->whereHas('users', function($query) use ($y) {
$query->where('users.id', $y);
})
->get();
你试过这个吗:路线问题的标题有误导性。您似乎要求使用分层递归结构,但您的问题更基本。这很有效,非常感谢
$userX = User::find($x);
$conversations = $userX->conversations()
->whereHas('users', function($query) use ($y) {
$query->where('users.id', $y);
})
->get();