Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过计算laravel中的孙子对象来检索子对象_Php_Mysql_Laravel_Eloquent - Fatal编程技术网

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();