Cakephp 3包含多个条件

时间:2017-08-30 12:04:30

标签: orm count associations cakephp-3.0 contain

我想通过相关的Jobstasks得到我的工作,但是从Jobstasks我想要计算总数1 - 所有工作中的任务(这很有效)和(评论,当然不工作)总计2 - 计算完成的任务。有什么想法吗?

$jobs = $this->Jobs->find('all')
            ->where(['Jobs.user_id' => $user_id])
            ->andWhere(['Jobs.start >' => new \DateTime('+6 days')])
            ->contain(['Jobgroups', 
                'Jobstasks' => function($q){
                    $q->select([
                        'JobsTasks.job_id',
                        'JobsTasks.finished',
                        'total1' => $q->func()->count('JobsTasks.job_id'), 
                        //'total2' => $q->func()->where(['JobsTasks.finished' => true])->count()
                    ])->group(['JobsTasks.id']);
                    return $q;
                }

            ])
            ->order(['Jobs.start' => 'ASC']);

2 个答案:

答案 0 :(得分:0)

我想你可以简单地对完成的列进行SUM,对于完成的任务,它是1,否则为0

'total1' => $q->func()->sum('JobsTasks.finished')

这适用于布尔人。如果你有一个更复杂的条件,我会创建一个计算字段来评估你的条件,而不是WHERE子句

类似

'total2' => "SUM(IF(JobsTasks.finished = true, 1, 0))" 

答案 1 :(得分:0)

Thnx给你Arilia,你的总数2很棒:)改变total1是没有必要的。以下是解决方案。我必须更改分组以获得正确的数据输出。

$jobs = $this->Jobs->find('all')
            ->where(['Jobs.user_id' => $user_id])
            ->andWhere(['Jobs.start >' => new \DateTime('+6 days')])
            ->contain(['Jobgroups', 
                'Jobstasks' => function($q){
                    $q->select([
                        'JobsTasks.job_id',
                        'total1' => $q->func()->count('JobsTasks.finished'), 
                        'total2' => "SUM(IF(JobsTasks.finished = 1, 1, 0))" 
                    ])->group(['JobsTasks.job_id']);
                    return $q;
                }
            ])
            ->order(['Jobs.start' => 'ASC']);