2017-08-30 3 views
0

Ich möchte meine Jobs mit zugehörigen Jobstasks bekommen, aber von Jobstasks möchte ich total1 gezählt werden - alle Aufgaben im Job (das funktioniert gut), und (kommentiert, natürlich funktioniert nicht) total2 - gezählt beendete Aufgaben. Irgendeine Idee?CakePHP 3 mehrere Bedingung in enthalten

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

Antwort

0

Ich denke, dass man einfach die fertige Spalte SUM kann, Sinc es ist 1 für die fertigen Aufgaben und 0 sonst

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

Das für booleans arbeitet. Falls Sie eine komplexere Bedingung hätte ich statt einer WHERE-Klausel

so etwas wie

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

Thnx Sie Arilia, Ihre total2 funktioniert super :) Änderung total1 nicht ein berechnetes Feld Auswertung Ihrer Bedingung erstellen ist notwendig. Unten ist die Lösung. Und ich muss Gruppierung für korrekte Datenausgabe ändern.

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