在普通模型中,Cake 的模型链接由模型的recursive
属性决定。您的示例模型关系如下所示:
User
-> belongsTo Company
-> hasMany Department
-> hasMany Address
-> hasMany PhoneExtension
(我添加了一个额外的关系 ( User hasMany PhoneExtension
) 来充实以下解释。)
有三个可接受的值Model::recursive
:-1、0、1 和 2。每个值向 Cake 的 ORM 指示检索模型记录的不同深度。我将$this->User->find('all')
用来说明差异。
在recursive = -1
,Cake 只检索指定的模型(即User
)。它不解析任何模型关联。
在recursive = 0
,Cake 检索指定的模型,并解析其belongsTo
关联。$this->User->find('all')
将检索所有User
记录,以及Company
每个记录User
所属的记录。
在recursive = 1
处,Cake 检索指定的模型,并解析其所有直接关联。$this->User->find('all')
将检索所有User
记录,以及Company
每个记录User
所属的记录,以及PhoneExtension
属于User
.
在recursive = 2
处,Cake 检索指定的模型,解析其所有直接关联及其直接关联的所有关联。$this->User->find('all')
将检索示例模型关系图中的所有内容:所有User
记录、记录所属Company
的User
记录、属于 的所有PhoneExtension
记录以及属于 的User
所有Department
和Address
记录Company
。
这是很长的一段话,是的,你可以达到你在问题中指出的结果,在recursive = 2
。
如果你想比你得到的更深入recursive = 2
,你将不得不使用Containable
behavior。假设您的Department
模型有一个额外的关联:hasMany Group
. 因此:
User
-> belongsTo Company
-> hasMany Department
-> hasMany Group
-> hasMany Address
-> hasMany PhoneExtension
要检索我们通过检索获得的所有内容recursive = 2
以及所有相关Group
记录,您可以这样构建Model::find
调用:
$this->User->find('all', array(
'contain' => array(
'PhoneExtension',
'Company' => array(
'Department' => array( 'Group' ),
'Address'
)
)
));