多对多的关系。如何搜索一个共同的2个集合?

时间:2018-05-25 14:47:18

标签: laravel laravel-5 model relationship

我的项目中有多对多的关系。 用户belongsToMany聊天 和 聊天belongsToMany用户。

所以,我有一个带有chat_id和user_id的数据透视表chat_user。

一次聊天也可以包含一些用户

没关系,效果很好。

当我创建新聊天时,我有2个用户。我想检查一下,他们之间是否已经有过常见的聊天。

我对此查询有一些问题。 我也尝试在chat_user表上制作自定义模型..但没有运气=( 可能有人做过这样的工作吗?有没有实践?谢谢!

2 个答案:

答案 0 :(得分:0)

最简单的方法可能是只占一个用户并寻找另一个用户。假设你的关系是正确的,就像这样:

$firstUserChats = $firstUser->chats()->pluck('user_id');
$usersHaveACommonChat = $firstUserChats->contains($secondUser->id);

虽然有一种方法可以在一行中完成,但这通常就像它一样容易。 :)

答案 1 :(得分:0)

一种方法是使用whereHas()查询构建器方法:

$user1->chats()->whereHas('users', function($q) use ($user2) {
    $q->where('user_id', '=', $user2->id);
})->get();

作为一种最佳做法,我个人希望将这样的内容整合到模型中(在本例中为您的聊天模型)作为query scope以便于使用:

// class App\Chat
public function scopeWithUser($query, User $user)
{
    $query->whereHas('users', function ($q) use ($user) {
        $q->where('user_id', '=', $user->id);
    });
}

然后,您可以像这样使用它:

// get common chats between user1 and user2
$user1->chats()->withUser($user2)->get();

// see if a common chat exists
$user1->chats()->withUser($user2)->exists();

我认为这是非常易读的。