2016-04-26 33 views
5

Mam tabeli post a to ma ma-wiele połączeniu z tabelą Stars.hrabia zawierać w CakePHP 3

mogę uzyskać wszystkie dane związane z wykorzystaniem:

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

który działa dobrze.

Ale chcę policzyć gwiazdy. Próbowałem tego, ale nie działa:

$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 

Nie zwraca liczby powiązanych gwiazdek.

Czy coś jest nie tak, czy powinno zrobić to w inny sposób?

Dzięki

+0

"_doesn't work_" nie jest właściwym opisem problemu! Nawet jeśli problem może być oczywisty dla osób, które znają pliki wewnętrzne CakePHP, zawsze bądź tak dokładny, jak to tylko możliwe, i to, co może się wydarzyć w zamian. Pokaż dane, z którymi pracujesz, kontekst, próby debugowania i możliwe błędy. Często problem rozwiązuje się podczas gromadzenia tych informacji. – ndm

Odpowiedz

9

trzeba wybrać także klucz obcy inaczej ciasto nie jest w stanie przyłączyć się do tabel. I trzeba także grupy wynik

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

    return $q; 
} 
+0

To działa dokładnie tak, jak chcę .. Dzięki ... – Willian

+0

Brak 'brace brace w funkcji' group() '. Zaktualizuj to. @arilia –

+0

@SumonSarker Edytowałem, ale możesz też edytować odpowiedzi, jeśli chcesz – arilia

-1

Spróbuj tego:

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

Jak sędziował w cookbook.

0

Jak tu użyliśmy łącznie jako wirtualnym polu, może być stworzenie bardziej jak to w tym samym modelu jak:

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

    } 

Jak tu obliczyli zakończone, chcę, aby obliczyć odwołany z innego warunku WHERE, co będzie składnia tego w cakephp3?