2016-04-26 25 views
5

Ho una tabella post e questo ha un ha-molti associazione con un tavolo Stelle.Conte nel contenere CakePHP 3

posso ottenere tutti i dati associati con:

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

che funziona bene.

Ma voglio contare le stelle. Ho provato questo, ma non funziona:

$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 

Questo non restituisce il numero di stelle associate.

C'è qualcosa di sbagliato o dovrebbe farlo in un altro modo?

Grazie

+0

"_doesn't work_" non è una descrizione appropriata del problema! Anche se il problema potrebbe essere ovvio per le persone che conoscono gli interni di CakePHP, ti preghiamo di essere sempre il più specifico possibile su ciò che accade _esattamente_, e invece cosa ti aspetti che succeda. Mostra i dati con cui stai lavorando, il contesto, i tentativi di debug e eventuali errori. Spesso il problema si risolve da solo quando si raccolgono queste informazioni. – ndm

risposta

9

dovete selezionare anche la chiave esterna altrimenti torta non è in grado di unire le tabelle. E si deve anche al gruppo il risultato

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

    return $q; 
} 
+0

Funziona esattamente come voglio..Grazie ... – Willian

+0

C'è una parentesi ')' mancante nella funzione 'group()'. Si prega di aggiornarlo. @arilia –

+0

@SumonSarker Ho modificato, ma puoi anche modificare le risposte se vuoi – arilia

-1

Prova questa:

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

Come arbitrato nel cookbook.

0

Come qui abbiamo usato totale come campo virtuale, può essere creare più come questo in stesso modello:

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

    } 

Come qui ho calcolato completato, voglio calcolare annullato con diversa condizione in cui, ciò che sarà la sintassi per esso in cakephp3?