CakePHP find () условия для записей ассоциации

У меня есть следующая команда, получая записи из моей БД со связанными записями 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
)
));

0

Решение

Причина, по которой вы получаете ошибку, состоит в том, что ваши отношения hasMany поэтому, когда торт делает contain на самом деле он делает более одного запроса для вашего find, В результате вы не можете указать 'Post.published' => 1 в условиях как Post псевдоним не будет существовать в основном запросе (тот, который получает ваши тизеры).

Вместо этого вам нужно передать дополнительное условие как часть содержимого: —

$teasers = $this->Teaser->find('all', [
'contain' => [
'Post' => [
'conditions' => [
'Post.published' => 1
]
]
],
'conditions' => [
'Teaser.published' => 1,
]
]);

Это позволит Cake знать условия, которые вы хотите использовать при построении запроса для записей.

1

Другие решения

Вы должны прочитать документацию для Containable а также Извлечение данных. Это основы.

$teasers = $this->Teaser->find('all', array(
'contain' => [
'Post' => [
'conditions' => [
'published' => 1
]
]
],
'conditions' => array(
'Teaser.published' => 1,
)
));
1

Вы можете написать условие в вашей модели Teaser.php лайк

public $hasMany = array(
'Post' => array(
'className' => 'Post',
'conditions' => array('Post.published' => 1)
)
);
0
По вопросам рекламы [email protected]