【问题标题】:laravel query builder count relationshiplaravel 查询构建器计数关系
【发布时间】: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 语句之一是限制返回的数量。

标签: mysql laravel eloquent


【解决方案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

【讨论】:

  • 我不知道简单的加入不算空......在我的情况下是合同:-)
猜你喜欢
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2013-05-02
  • 1970-01-01
  • 2019-04-24
  • 2019-06-07
  • 1970-01-01
相关资源
最近更新 更多