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.
