我在 Laravel 应用程序中有 User 和 Chat 模型。用户可以是许多聊天的成员,因此我在聊天和用户之间有多对多关系 - 使用 belongsToMany
。
假设我知道几个用户 ID,并且我想检索所有 共同的聊天 (这些聊天中它们同时为成员,例如,所有 具有给定 ID 的用户都聚集在其中的群聊)。如何使用 Laravel 构建此查询?
Chat::join('chat_user', 'chat_id', 'chats.id')
->whereIn('chat_user.user_id',$listOfUserIds)
->selectRaw('chat_user.chat_id, COUNT(1) as users_count')
->groupBy('chat_user.chat_id')
->having('users_count','=', count($listOfUserIds));
这是最优的,因为它只连接了枢轴。
更优雅的方法是使用 whereHas
和“基数”参数,即查找所有参与其中的用户所涉及的所有聊天,只要他们都参与其中。
Chat::whereHas('user', function ($q) {
return $q->whereIn('id', $listOfUserIds);
}, '=', count($listOfUserIds));
您可以使用:
$membersWithChats = Member::whereIn('id', $listOfIDs)->with('chats')->get();
whereIn
的行为类似于OR
,但使用条件数组进行where([...])
应该像AND
一样运作。 - apokryfos