首页 > 解决方案 > 使用 WHERE 条件获取包含模型的计数字段

问题描述

我有三个模型,Companieseventsassistants,其中assistants表存储 event_id 和 company_id。我想获得一个查询,其中存储了公司对某种事件的总援助。然而,由于所有这些计数都链接到同一个表,我真的不知道如何有效地构建这个查询。我将每种事件的辅助 ID 存储在一些数组中,然后执行以下操作:

$query = $this->Companies->find('all')->where($conditions)->order(['name' => 'ASC']);

$query
    ->select(['total_assistances' => $query->func()->count('DISTINCT(Assistances.id)')])
    ->leftJoinWith('Assistances')
    ->group(['Companies.id'])
    ->autoFields(true);

尽管如此,我不知道如何获得其余的协助计数,因为我不需要计算所有不同的协助 ID,而只需要计算那些适合某些条件的 ID,例如->select(['assistances_conferences' => $query->func()->count('DISTINCT(Assistances.id)')])->where($conferencesConditions)(但显然前一行不起作用。有没有办法在查询本身中计算不同类型的帮助?(我需要这样做,因为我计划使用分页并考虑这些字段对表进行排序)。

标签: phpjoincakephpconditional-statementscakephp-3.x

解决方案


这些*JoinWith()方法接受第二个参数,一个回调,它接收用于影响选择列表的查询构建器,以及连接的条件。

->leftJoinWith('Assistances', function (\Cake\ORM\Query $query) {
    return $query->where([
        'Assistances.event_id IN' => [1, 2]
    ]);
})

这将生成一个像这样的连接语句,它只包括(并因此计算)Assistanceswith an event_idof 1or 2

LEFT JOIN
    assistances Assistances ON
        Assistances.company_id = Companies.id AND
        Assistances.event_id IN (1, 2)

传递给回调的查询构建器实际上只支持选择字段和添加条件,需要在主查询上定义更复杂的语句,或者您可能必须切换到使用子查询。

也可以看看


推荐阅读