我在 Laravel 应用程序中有用户和聊天模型。用户可以成为多个聊天的成员,因此我在聊天和用户之间建立了多对多关系 - 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));
这仍然只执行一个查询,但加入了数据透视表和用户表。
关于php - 在 Laravel 中找到交点的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61438678/