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 个计数。但是如何使用查询生成器来做到这一点?

【问题讨论】:

如果你在 mysql SELECT * 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 查询构建器计数关系的主要内容,如果未能解决你的问题,请参考以下文章

具有依赖项计数的 Laravel 查询构建器

如何使用 Laravel 的流畅查询构建器选择计数?

Laravel 通过属性获得雄辩的查询构建器关系

Laravel 查询构建器与雄辩的关系

Laravel 雄辩与查询构建器的优缺点

Laravel Eloquent ORM - 选择所有两个关系都不存在的模型时,生成的 SQL 和查询构建器结果不匹配