我有一个表发布,这与表星星的 has-many 关联。
我可以使用以下方式获取所有相关数据:
$this->Posts->find()->contain(['Stars']);
效果很好。
但我想数星星。我试过这个但是没有用:
$this->Posts->find->contain([
'Stars' => function($q) {
return $q->select(['total' => $q->func()->count('Stars.post_id')]);
}
]);
//I've also tried this
...
...$q->select(['total' => "COUNT(Stars.post_id)"]);
...
//Also fail
这不会返回相关星号的数量。
有什么不对或应该用其他方式吗?
由于
答案 0 :(得分:14)
您还必须选择外键,否则蛋糕无法加入表格。而且你还要对结果进行分组
'Stars' => function($q) {
$q->select([
'Stars.post_id',
'total' => $q->func()->count('Stars.post_id')
])
->group(['Stars.post_id']);
return $q;
}
答案 1 :(得分:0)
在这里我们使用total作为虚拟字段,可以在相同的模型中创建更多像这样:
public function index()
{
$checklist = TableRegistry::get('Checklists');
$query = $checklist->find()
->where('Checklists.is_deleted = 0')
->contain([
'ChecklistTitles' => function($q) {
return $q -> select([
'ChecklistTitles.title',
'ChecklistTitles.checklist_id'
]);
},
'ChecklistTypes' => function($w){
return $w->select(['ChecklistTypes.type']);
},
'AssignedChecklists' => function($e){
$e->select([
'AssignedChecklists.checklist_id',
'completed' => $e->func()
->count('AssignedChecklists.checklist_id'),
])
->group(['AssignedChecklists.checklist_id'])
->where(['AssignedChecklists.is_deleted = 0 AND AssignedChecklists.checklist_status = 2']);
return $e;
}
]);
// ->toArray();
// pr($query);die;
$this->paginate = [
'limit' => 20,
'sortWhitelist' => [
'id', 'checklist_title', 'checklist_type'
]
];
$this->set('query', $this->paginate($query));
$this->set(compact('checklists','query'));
$this->set('_serialize', ['checklists','query']);
}
在这里我已经计算完了,我想用不同的where条件计算取消,cakephp3中的语法是什么?
答案 2 :(得分:-3)