2016-04-26 14 views
5

Ich habe eine Tabelle Beitrag und dies hat eine hat-viele Verbindung mit einem Tisch Sterne.Count enthalten in CakePHP 3

Ich kann alle zugehörigen Daten erhalten mit:

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

, das gut funktioniert.

Aber ich möchte die Sterne zählen. Ich habe es versucht, aber es funktioniert nicht:

Dies gibt nicht die Anzahl der zugehörigen Sterne.

Gibt es etwas falsch oder sollte es anders gehen?

Dank

+0

"_doesn't work_" ist keine richtige Problembeschreibung! Auch wenn das Problem für Leute offensichtlich ist, die die CakePHP-Interna kennen, sei bitte immer so genau wie möglich, was _exactly_ passiert und was du stattdessen erwartest. Zeigen Sie die Daten, mit denen Sie arbeiten, den Kontext, Ihre Debugging-Versuche und mögliche Fehler an. Oft löst sich das Problem selbst beim Sammeln dieser Informationen. – ndm

Antwort

9

Sie haben auch die Fremdschlüssel auswählen sonst Kuchen die Tabellen verknüpfen nicht in der Lage ist. Und Sie haben auch zu einer Gruppe das Ergebnis

'Stars' => function($q) { 
    $q->select([ 
     'Stars.post_id', 
     'total' => $q->func()->count('Stars.post_id') 
    ]) 
    ->group(['Stars.post_id']); 

    return $q; 
} 
+0

Das funktioniert genau wie ich will .. Danke ... – Willian

+0

Es gibt eine ')' geschweifte Klammer fehlt in 'group()' -Funktion. Bitte aktualisiere es. @arilia –

+0

@SumonSarker Ich habe bearbeitet, aber Sie können die Antworten auch bearbeiten, wenn Sie wollen – arilia

-1

Try this:

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

Wie in den cookbook referierte.

0

Wie wir hier insgesamt als virtuelles Feld verwendet haben, kann in demselben Modell wie diese mehr schaffen als:

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

    } 

Wie hier habe ich fertig berechnet, mag ich mit verschiedener, wo Bedingung aufgehoben zu berechnen, was wird die Syntax dafür in CakePHP3 sein?