【问题标题】:retrieve child object by evaluating grandchildren object in laravel通过评估 laravel 中的孙对象来检索子对象
【发布时间】:2021-04-03 00:27:16
【问题描述】:

我有 2 个模型,UserConversation 相互关联,具有多对多关系,多用户多会话。

在我的模型上,我有:

User:

public function conversation() {
    return $this->belongsToMany('App\Models\Conversation');
}

Conversation:

public function users() {
    return $this->belongsToMany('App\Models\User');
}

所以我可以通过$user->conversation; 获取用户的对话,反之亦然,通过$conversation->users 检索用户的对话,就像一个魅力。问题是我想要一种方法来检索某个用户之前联系过的所有用户,简而言之,类似于:

$user = User::find(1);
$talkedUsers = $user->conversation->user.

还有一种方法可以检查用户“x”与用户“y”进行的所有对话(“如果有”)

$userX = User::find(1);
$userY = 2;
    
$talkedUser = $userX->conversation->where('user.id', '=', $userY);

显然,上面的代码行不通。我想知道这样的事情是否可以在不添加复杂的原始查询的情况下完成,我希望只使用QueryBuilder

【问题讨论】:

标签: php mysql laravel eloquent


【解决方案1】:

问题是我想要一种方法来检索某个用户的所有用户 之前联系过,

$user->conversation实际上是对话的集合,最好使用复数,即$user->conversations。然后您可以使用高阶消息一次处理多个对象。更多信息请见https://laravel.com/docs/8.x/collections#higher-order-messages

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

【讨论】:

    猜你喜欢
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2016-03-18
    • 2020-06-03
    • 2021-05-20
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多