2017-08-30 4 views
0

Je veux obtenir mes travaux avec les Jobstasks associés, mais de Jobstasks je veux être compté total1 - toutes les tâches dans le travail (qui fonctionne bien), et (commenté, bien sûr ne fonctionne pas) total2 - compté tâches terminées. Une idée?Cakephp 3 plusieurs conditions dans contenir

$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']); 

Répondre

0

Je suppose que vous pouvez simplement SUM la colonne finie, il est SINC 1 pour les tâches terminées et 0 sinon

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

Cela fonctionne pour booléens. Si vous avez un problème plus complexe, je voudrais créer un champ calculé l'évaluation de votre état au lieu d'une clause WHERE

quelque chose comme

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

Thnx vous Arilia, votre total2 fonctionne très bien :) changement total1 est pas nécessaire. Voici la solution. Et je dois changer de groupe pour une sortie de données correcte.

$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']);