Laravel计数和按孩子关系分组

时间:2018-08-02 20:07:26

标签: laravel group-by count eloquent relationship

我有两个表,一个叫companies,另一个叫leads。我想使用Laravel的口才,为每个公司获取潜在客户的数量。这很简单,但我还需要按Leads状态对它们进行分组。

例如

A公司有

3 hot leads
2 cold leads

乙公司有

6 cold leads
0 hot leads

Companies表具有以下结构:

 id
 name

Leads表具有以下结构

 id
 company_id
 status (hot, cold)

我尝试了以下方法,该方法可以获取每家公司的潜在客户数量,但这需要根据潜在客户的状态进行进一步分组

 DB::table('companies')
     ->selectRaw('companies.id, companies.name, COUNT(*) as count')
     ->join('leads', 'leads.company_id', '=', 'companies.id')
     ->groupBy('id')
     ->get();

1 个答案:

答案 0 :(得分:1)

在使用count之类的汇总时,您需要确保按所有选定的非汇总列进行分组。

MySQL通常会让您不去做,但是查询结果可能会变得毫无意义。

$companies = DB::table('companies')
    ->select(['companies.name', 'leads.status', \DB::raw('COUNT(*) as count')])
    ->join('leads', 'leads.company_id', '=', 'companies.id')
    ->groupBy('companies.name', 'leads.status')
    ->get();

如果公司表中有多个具有相同名称(但ID不同)的记录,则将每个重复的公司名称的所有计数分组在一起。如果是这种情况,还应该选择companies.id并按其分组。

如果您想按公司,然后按状态键入,则应该可以进行以下操作...

$companies = $companies->groupBy('name')->map(function ($company) {
    return $company->groupBy('status')->map(function ($company) {
        return $company->first()['count'];
    });
});

然后您可以像...一样使用它

echo $companies['testCompanyName']['hot']; 
echo $companies['testCompanyName']['cold'];