CakePHP不包含包含模型为空的记录

时间:2014-03-10 21:00:45

标签: cakephp paginator containable

所以我当前的分页设置如下所示:

    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的记录(Model1Model2的父级)不应包含在$this->paginate('Model0');的返回数组中。

如何实现这一目标?

3 个答案:

答案 0 :(得分:0)

我不确定是否可以通过可包含的行为实现这一点。我知道你可以通过手动连接来做到这一点(免责声明:我可能在我的查询中关闭,因为我还没有测试过):

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

    ));

答案 1 :(得分:-1)

将根条件设置为需要Model2的有效ID。

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

根据您的型号关系,这可能不起作用。它只适用于belongsTo和hasOne我相信。在这种情况下,您应该从Model2开始分页或使用bindModel来建立临时模型关系。

答案 2 :(得分:-1)

在查询的基本级别而不是在包含内部设置条件。只需确保为它们添加型号名称。

public $paginate = array(
    'conditions' => array(
        'Model2.type' => 'Sometype'
    ),
    'limit' => 30,
    'contain' => array(
        'Model1' => array(
            'fields' => array('id')
         ),
         'Model2' => array(
             'Model3' => array(
                 'fields' => array('someField')
             ),
         ),
    )

);