Laravel 多对多关联查询

对于Laravel 的多对多关联该如何查询

三个表

user

id name
1 aaa
2 bbb
3 ccc

role

id name
1 管理员
2 编辑
3 普通用户
4 特殊用户

role_user

role_id user_id
1 1
2 3
3 3
4 1
2 3
2 2
4 2
3 2

模型里都定义了正确的多对多关联

User::with('roles')->whereHas('roles', function($query) {
    $query->whereIn('role_id', [2,4]);
})->get();

如果使用上面这种方式查询出来的是用户权限为『编辑或者特殊用户』的用户。
该如何查询『即是编辑又是特殊用户』的 user 数据呢

阅读 6.6k
3 个回答

查询『即是编辑又是特殊用户』,其实就是获取 role_id=2role_id=4 的 user_id 的交集,用 SQL 可以写成:

SELECT
    user_id
FROM
    role_user
WHERE
    role_id IN (2, 4)
GROUP BY
    user_id
HAVING
    COUNT(user_id) = 2

在 Laravel 中可以写成:

User::with('roles')->whereHas('roles', function($query) {
    $query->whereIn('role_id', [2, 4])
          ->groupBy('user_id')
          ->havingRaw('COUNT(user_id) = ?', [2]);
})->get()

只需要改写一下where条件就ok了

User::with('roles')->whereHas('roles', function($query) {
    $query->where('role_id', 2)
        ->where('role_id', 4);
})->get();

试试

User::with('roles')->whereHas('roles', function($query) {
    $query->where([['role_id', 2],['role_id',4]]);
})->get();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏