算上包含Cakephp 3

时间:2016-04-26 23:18:59

标签: cakephp cakephp-3.0

我有一个表发布,这与表星星 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

这不会返回相关星号的数量。

有什么不对或应该用其他方式吗?

由于

3 个答案:

答案 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)

试试这个:

$total = $this->Posts->find()->contain(['Stars'])->count();

正如cookbook所述。