php - 使用 WHERE 条件获取包含模型的计数字段
问题描述
我有三个模型,Companies、events和assistants,其中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)
(但显然前一行不起作用。有没有办法在查询本身中计算不同类型的帮助?(我需要这样做,因为我计划使用分页并考虑这些字段对表进行排序)。
解决方案
这些*JoinWith()
方法接受第二个参数,一个回调,它接收用于影响选择列表的查询构建器,以及连接的条件。
->leftJoinWith('Assistances', function (\Cake\ORM\Query $query) {
return $query->where([
'Assistances.event_id IN' => [1, 2]
]);
})
这将生成一个像这样的连接语句,它只包括(并因此计算)Assistances
with an event_id
of 1
or 2
:
LEFT JOIN
assistances Assistances ON
Assistances.company_id = Companies.id AND
Assistances.event_id IN (1, 2)
传递给回调的查询构建器实际上只支持选择字段和添加条件,需要在主查询上定义更复杂的语句,或者您可能必须切换到使用子查询。
也可以看看
推荐阅读
- jquery - 如何将多个下拉值作为 URL 参数传递?
- geb - 如果不接受等待,则可以重新加载页面
- javascript - Photoshop JSX 裁剪:文件太大
- python - 数据标准化 vs 标准化 vs 强大的缩放器
- arrays - 在反应中映射对象键并返回子属性
- javascript - 如何使用 javascript/jQuery 在浏览器中创建页面位置?
- c# - 下载 Excel 文件后,Bootstrap 模式不会隐藏
- apache - htaccess 重定向到相同(未知)子文件夹中的 index.html
- c++ - 如何使用 Qt 减少小部件和窗口大小之间的距离?
- java - 使用 jbutton 从 jtable 中删除一行