我有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%')
));
有没有办法使用模型做同样的事情?
答案 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%')
)
)
)
));
*)只是我的内存模型,不能保证按原样工作