CakePHP 3 - warunki dla contain
Pokażę jak dodawać warunki do metody contain w CakePHP 3. Podczas korzystania z metody contain możesz ograniczyć dane zwracane przez asocjacje i filtrować je według określonych warunków. Aby podać warunki, przekaż funkcję anonimową, która jako pierwszy argument otrzymuje obiekt zapytania \Cake\ORM\Query: Spójrz na poniższy przykład:
$query = $articles->find()->contain('Comments', function (Query $q) { return $q ->select(['title', 'desc', 'created']) ->where(['Comments.published' => true]); });To również działa w przypadku stronicowanych wyników.
$this->paginate['contain'] = [ 'Comments' => function (Query $query) { return $query->select(['title', 'desc', 'created']) ->where(['Comments.published' => true]); } ];Możliwe jest też dodawanie warunków dla głębszych asocjacji.
$query = $articles->find()->contain([ 'Comments', 'Authors.Profiles' => function (Query $q) { return $q->where(['Profiles.is_published' => true]); } ]);Jeśli ograniczyłeś pola, które ładujesz za pomocą select, ale chcesz również załadować pola z zawartych asocjacji, możesz to zrobić tak jak poniżej (zwraca pola id, title z artykułów oraz wszystkie pola z komentarzy):
$query = $articles->find() ->select(['id', 'title']) ->select($articles->Comments) ->contain(['Comments']);Alternatywnie możesz napisać ->enableAutoFields(true). To załatwi pobieranie wszystkich pól dla wszystkich asocjacji.