Есть несколько способов добиться этого.
Это может быть просто:
$this->Device->find('all', array('recursive' => 2));
Но это может быть довольно трудоемким и расточительным, если у вас есть другие модели, которые будут автоматически извлечены.
Другим способом было бы добавить класс Group к вашей модели устройства:
var $hasOne = array(
'DeviceGroup' => array(
'className' => 'DeviceGroup',
'foreignKey' => 'device_group_id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => ''
),
'Group' => array(
'className' => 'Group',
'foreignKey' => false,
'dependent' => false,
'conditions' => 'Group.id = DeviceGroup.group_id',
'fields' => '',
'order' => ''
)
);
Это может быть проблематично, когда вы затем пытаетесь выполнить поиск из другой модели, которая автоматически включает отношение Группы устройства, когда у вас уже есть Группа в поиске. Поэтому лучше всего назвать это как-то в $ hasOne, например, «DeviceGroupGroup», что очень болезненно.
Мой предпочтительный метод - включить поведение Containable (я делаю это в app/app_model.php
, чтобы все модели автоматически включали Containable):
class AppModel extends Model {
var $actsAs = array('Containable');
}
И затем, не добавляя Группу к Модели устройства, вы можете сделать это:
$this->Device->find(
'all',
array(
'contain' => array('DeviceGroup', 'Group'),
'recursive' => 2,
)
);
Таким образом, даже если вы выполняете рекурсивный анализ относительно глубоко, вы извлекаете только те модели, которые вам действительно нужны, и если вы также используете параметр 'fields'
в своем find
, вы будете перемещаться по нему.