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')
             ),
         ),
    )

);

Другие вопросы по тегам