php - 在 Laravel 中找到交点的最佳方法

标签 php mysql laravel eloquent

我在 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/

相关文章:

php - 具有复杂 ORDER BY 的 MySQL 查询

java - Android - 显示来自 MySQL 的数据

php - 如果db column可以为NULL设置需要输入吗?

laravel Echo 不监听 channel 和事件

php - IoC 容器和全局变量

php - 在 Wordpress 中格式化 get_the_date 元素

php - 通过Redis Hash存储和查找

php - 如何使用sql在php的选择框中显示先前选择的选择选项

mysql2 gem 与 mysql 5.6.19 不兼容

html - pdf 中的 CSS 网格/flex