В простой ванильной модели связь модели Cake определяется атрибутом recursive
вашей модели. Ваш пример модели отношений выглядит примерно так:
User
-> belongsTo Company
-> hasMany Department
-> hasMany Address
-> hasMany PhoneExtension
(Я добавил дополнительные отношения (User hasMany PhoneExtension
), чтобы конкретизировать следующее объяснение.)
Существует три допустимых значения для Model::recursive
: -1, 0, 1 и 2. Каждое значение указывает ORM Cake разную глубину для извлечения записей модели. Я буду использовать $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
поведение . Допустим, ваша модель 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'
)
)
));