Отношения Cakephp в трех таблицах - PullRequest
0 голосов
/ 09 сентября 2011

У меня 3 стола.

  • Устройство имеет одну группу устройств
  • Группа имеет много устройств
  • DeviceGroup (принадлежит устройству и группе)

Теперь, если я сделаю $this->Device->find('all');, это даст мне результат:

Device => array
DeviceGroup => array

Теперь мне также нужны значения из таблицы групп, как я могу это сделать?

1 Ответ

1 голос
/ 09 сентября 2011

Есть несколько способов добиться этого.

Это может быть просто:

$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, вы будете перемещаться по нему.

...