laravel 查询构建器计数关系

laravel query builder count relationship

我被 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)

合同(身份证,姓名,user_id)

角色(id,名字)

*** 更新 2 ***

如果运行 eloquent

User::with('contracts', 'role')
->withCount('contracts')
->paginate(10);

它 return 所有 103 与计数。但是如何使用查询生成器来实现呢?

您在 Laravel 查询生成器中直接使用 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 问题以查看 JOINS 中的差异 -- Difference in MySQL JOIN vs LEFT JOIN