CakePHP не включает записи, чья содержанная модель пуста
Итак, мои текущие настройки пагинации выглядят так:
public $paginate = array(
'limit' => 30,
'contain' => array(
'Model1' => array(
'fields' => array('id')
),
'Model2' => array(
'conditions' => array(
'Model2.type' => 'Sometype'
),
'Model3' => array(
'fields' => array('someField')
)
)
)
);
Чего я хочу добиться, так это когда Model2
бывает пустым (нет Model2
с типом 'Sometype'
), то эта запись Model0
(родитель Model1
а также Model2
) не должен быть включен в возвращаемый массив $this->paginate('Model0');
,
Как этого достичь?
3 ответа
Я не уверен, что этого можно достичь с помощью сдерживаемого поведения. Я знаю, что вы можете сделать это с помощью ручных объединений (отказ от ответственности: я могу быть отключен в своем запросе, так как я не проверял это):
$results = $this->Model0->find('all', array(
'conditions' => array(
'Model2.id <>' => null,
),
'joins' => array(
array(
'table' => 'model2',
'alias' => 'Model2',
'type' => 'LEFT',
'conditions' => array(
'Model2.type' => 'Sometype',
'Model2.model0_id = Model0.id',
),
),
array(
'table' => 'model3',
'alias' => 'Model3',
'conditions' => array(
'Model3.model2_id = Model2.id'
),
),
),
));
Установите корневое условие, чтобы требовать действительный идентификатор для Model2.
public $paginate = array(
'limit' => 30,
'conditions'=>array(
'Model2.id >'=>0
)
'contain' => array(
'Model1' => array(
'fields' => array('id')
),
'Model2' => array(
'conditions' => array(
'Model2.type' => 'Sometype'
),
'Model3' => array(
'fields' => array('someField')
)
)
)
);
В зависимости от вашей модели отношений это может не сработать. Это работает только для принадлежит и имеет один, я верю. В этом случае вы должны начать нумерацию страниц с Model2 или использовать bindModel для временных связей модели.
Установите условия на базовом уровне запроса, а не внутри содержимого. Просто убедитесь, что префикс их с названием модели.
public $paginate = array(
'conditions' => array(
'Model2.type' => 'Sometype'
),
'limit' => 30,
'contain' => array(
'Model1' => array(
'fields' => array('id')
),
'Model2' => array(
'Model3' => array(
'fields' => array('someField')
),
),
)
);