У меня есть следующая команда, получая записи из моей БД со связанными записями hasMany:
$teasers = $this->Teaser->find('all', array(
'conditions' => array(
'Teaser.published' => 1
),
));
Теперь также posts
записи будут выбраны, из-за hasMany
связь.
Вывод выглядит так:
array(
0 => array(
'Teaser' => array(
'id' => '1',
'user_id' => '63',
'token' => '56d455bc20cfb56d455bc20d08',
// this goes on
),
'Post' => array(
0 => array(
'id' => '1',
'teaser_id' => '1',
'title' => 'blabla',
'text' => 'blabla',
'published' => 1,
// this goes on
)
)
)
)
Теперь мой вопрос, как я могу включить что-то в conditions
, чтобы отфильтровать также Post
-entries?
Когда я ввожу это так, я получаю сообщение об ошибке:
$teasers = $this->Teaser->find('all', array(
'conditions' => array(
'Teaser.published' => 1,
'Post.published' => 1
)
));
Причина, по которой вы получаете ошибку, состоит в том, что ваши отношения hasMany
поэтому, когда торт делает contain
на самом деле он делает более одного запроса для вашего find
, В результате вы не можете указать 'Post.published' => 1
в условиях как Post
псевдоним не будет существовать в основном запросе (тот, который получает ваши тизеры).
Вместо этого вам нужно передать дополнительное условие как часть содержимого: —
$teasers = $this->Teaser->find('all', [
'contain' => [
'Post' => [
'conditions' => [
'Post.published' => 1
]
]
],
'conditions' => [
'Teaser.published' => 1,
]
]);
Это позволит Cake знать условия, которые вы хотите использовать при построении запроса для записей.
Вы должны прочитать документацию для Containable а также Извлечение данных. Это основы.
$teasers = $this->Teaser->find('all', array(
'contain' => [
'Post' => [
'conditions' => [
'published' => 1
]
]
],
'conditions' => array(
'Teaser.published' => 1,
)
));
Вы можете написать условие в вашей модели Teaser.php
лайк
public $hasMany = array(
'Post' => array(
'className' => 'Post',
'conditions' => array('Post.published' => 1)
)
);