CakePHP检索忽略“ hasMany”的数据

时间:2018-11-10 02:12:43

标签: php cakephp cakephp-2.0

我有2张桌子-Box和Apple。苹果属于一个盒子,一个盒子里有很多苹果。在代码中看起来像这样:

class Apple extends AppModel {
    public $useDbConfig = 'somedb';
    public $useTable = 'apple';
    public $belongsTo = array(
        'Box' => array(
            'className' => 'Box',
            'foreignKey' => 'box_id'
        )
    );
} 
class Box extends AppModel {
    public $useDbConfig = 'somedb';
    public $useTable = 'box';
    public $hasMany = array(
        'Apple' => array(
            'className' => 'Apple',
            'foreignKey' => 'box_id',
            'dependent' => true
        )
    );
}

当我请求包装盒时:$this->Box->find("all")我会收到所有包装盒的清单+每个包装盒的所有苹果的清单:

(Array):
    [0] => (Array):
        [Box] => (Array):
            // some data
        [Apple] => (Array):
            [0] => (Array):
                // some data
            [1] => (Array):
                // some data
            ...
    [1] => (Array):
        [Box] => (Array):
            // some data
        [Apple] => (Array):
            [0] => (Array):
                // some data
            [1] => (Array):
                // some data
    ...

那么,我怎样才能只收到几盒没有苹果的盒子?

更新: 正如@Ben回答的那样,我需要将递归= -1(或0)。

但是,我现在继续这个问题:如果我还有一个模型-Room,房间可以包含盒子,因此$hasMany中的Room选项应为{ Box$belongsTo的{​​1}}和Room选项:

Box

那么,我如何才能一起获取有关苹果,盒子和房间的数据?假设我有一个 class Room extends AppModel { public $useDbConfig = 'somedb'; public $useTable = 'room'; public $hasMany = array( 'Box' => array( 'className' => 'Box', 'foreignKey' => 'room_id' ) ); } // Edited Box class class Box extends AppModel { public $useDbConfig = 'somedb'; public $useTable = 'box'; public $hasMany = array( 'Apple' => array( 'className' => 'Apple', 'foreignKey' => 'box_id', 'dependent' => true ) ); public $belongsTo = array( 'Room' => array( 'className' => 'Room', 'foreignKey' => 'room_id' ) ); } 的条件:Room。我尝试了下一件事情:

where room.name like "room0%"

但是我只收到一组Apple-Box“对”。

更新:我目前找到的唯一解决方案是下一个:

    $some = $this->Apple->find("all", array(
        'joins' => array(
            array('table' => 'room',
                'alias' => 'Room',
                'type' => 'INNER',
                'conditions' => array(
                    'Room.id = Box.room_id',
                )
            )
        ),
        'conditions' => array('Room.name LIKE' => 'room0%')
    ));

有没有办法使用模型做同样的事情?

2 个答案:

答案 0 :(得分:1)

在cakephp 2中,包含在您的查找调用中自动设置为recursive => -1的包含项。

答案 1 :(得分:1)

对于复杂的关联查询,建议使用Containable。有了它,您可以比在模型/查找调用中仅recursive = -1 go deeper,而无需手动进行手动联接。

设置“可容纳”后,您的查询可能类似于*

$this->Apple->find('all', array(
    'contain' => array(
        'Box' => array(
            'Room' => array(
                'conditions' => array('Room.name LIKE' => 'room0%')
            )
        )
    )
));

*)只是我的内存模型,不能保证按原样工作