Laravel Eloquent计算多对多的关系

时间:2016-07-01 01:35:22

标签: sql laravel join eloquent

拥有用户,公司和company_user数据透视表:如何让公司按其用户排序?

以下查询几乎就是这样。这里唯一的问题是我得到的公司至少有一个用户。没有用户关系的每家公司都没有被考虑在内。

$companies = Company::->with('users')
    ->join('company_user', 'companies.id', '=', 'company_user.company_id')
    ->selectRaw('companies.*, count(*) as `aggregate`')
    ->groupBy('companies.id')
    ->orderBy('aggregate', 'desc')
    ->get();

示例输出应为:

company_1 (users: 4)
company_2 (users: 2)
company_3 (users: 0)
company_4 (users: 0)

上述查询的输出是:

company_1 (users: 4)
company_2 (users: 2)

1 个答案:

答案 0 :(得分:1)

您的某些公司似乎被INNER JOIN删除了。如果是这样,您可以尝试使用LEFT JOINSUM(以计算行的基数)来保留缺失的数据:

$companies = Company::->with('users')
    ->leftJoin('company_user', 'companies.id', '=', 'company_user.company_id')
    ->selectRaw('companies.*,
                 sum(case when company_user.company_id is null then 0 else 1 end) as `aggregate`')
    ->groupBy('companies.id')
    ->orderBy('aggregate', 'desc')
    ->get();

我最初也尝试使用COUNT(),但似乎始终坚持将NULL行计为1.相反,我使用{{切换到SUM() 1}}表达式并且工作正常。

请按照以下链接查看正在运行的演示:

SQLFiddle