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.