laravel 查询构建器计数关系
Posted
技术标签:
【中文标题】laravel 查询构建器计数关系【英文标题】:laravel query builder count relationship 【发布时间】:2021-12-30 11:29:06 【问题描述】:我被 laravel 8 中的查询生成器卡住了
DB::table('users')
->join('contracts', 'users.id', '=', 'contracts.user_id')
->join('roles', 'roles.id', '=', 'users.role_id')
->select('users.id', 'users.username', 'users.email', DB::raw('COUNT(contracts.user_id) as numberOfContracts'))
->groupBy('users.id')
->paginate(10);
我只获得了总条目中的 80 个 .... 我有 103 个用户。
我当然想用分页显示所有用户.....并为每个用户显示角色以及有多少合同。
我做错了什么?
*** 更新 ***
表格如下:
用户(id、用户名、电子邮件、role_id)
合约(id、name、user_id)
角色(ID、姓名)
*** 更新 2 ***
如果运行雄辩
User::with('contracts', 'role')
->withCount('contracts')
->paginate(10);
它返回所有 103 个计数。但是如何使用查询生成器来做到这一点?
【问题讨论】:
如果你在 mysqlSELECT * FROM users GROUP BY users.id
中直接查询返回多少行?会不会有重复的ID?
嗨@Zak。 103 行
您是否使用 JOIN 语句运行原始 MySQL 查询?
不,我没有运行它
在不知道您的表以及其中的内容的情况下尝试一下。我猜您的 JOIN 语句之一是限制返回的数量。
【参考方案1】:
你在 Laravel Query Builder 中直接使用 JOIN
(等同于 INNER JOIN
,因为这是 MySQL 默认的)。它不会考虑空合同或角色。您需要 LEFT JOIN
来执行此操作。
DB::table('users')
->leftJoin('contracts', 'users.id', '=', 'contracts.user_id')
->leftJoin('roles', 'roles.id', '=', 'users.role_id')
->select('users.id', 'users.username', 'users.email', DB::raw('COUNT(contracts.user_id) as numberOfContracts'))
->groupBy('users.id')
->paginate(10);
查看此 SO Question 以了解 JOINS
的区别 -- Difference in MySQL JOIN vs LEFT JOIN
【讨论】:
我不知道简单的加入不算空......在我的情况下是合同:-)以上是关于laravel 查询构建器计数关系的主要内容,如果未能解决你的问题,请参考以下文章