我的项目中有多对多的关系。 用户belongsToMany聊天 和 聊天belongsToMany用户。
所以,我有一个带有chat_id和user_id的数据透视表chat_user。
一次聊天也可以包含一些用户
没关系,效果很好。
当我创建新聊天时,我有2个用户。我想检查一下,他们之间是否已经有过常见的聊天。
我对此查询有一些问题。 我也尝试在chat_user表上制作自定义模型..但没有运气=( 可能有人做过这样的工作吗?有没有实践?谢谢!
答案 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();
我认为这是非常易读的。