【问题标题】:Getting count fields of contained models using WHERE conditions使用 WHERE 条件获取包含模型的计数字段
【发布时间】:2020-12-17 16:39:01
【问题描述】:

我有三个模型,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);

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

【问题讨论】:

    标签: php join cakephp conditional-statements cakephp-3.x


    【解决方案1】:

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

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

    这将生成一个像这样的连接语句,它只包括(因此计数)Assistancesevent_id12

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

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

    另见

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多