cakephp 使用WHERE条件获取包含的模型的计数字段

blmhpbnm  于 2022-11-12  发布在  PHP
关注(0)|答案(1)|浏览(126)

我有三个模型,Companieseventsassistances,其中 assistances 表存储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);

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

wd2eg0qa

wd2eg0qa1#

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

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

这将生成一个如下所示的连接语句,该语句将只包含(并因此计算)12event_idAssistances

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

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

*Cookbook〉数据库访问和ORM〉查询生成器〉按关联数据筛选

相关问题