Палец вверх 0
Перевод
Перевод

Cakephp отношения в трех таблицах

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

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

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

Device => array
DeviceGroup => array

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

cakephp cakephp-1.3
задан vibha 9 сент. 2011 г., 10:43:04
источник

1 ответ

Решение 1
Перевод
Перевод

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

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

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

ответ дан ianmjones 9 сент. 2011 г., 12:28:46
источник