三个表中的Cakephp关系

时间:2011-09-09 06:43:04

标签: cakephp cakephp-1.3

我有3张桌子。

  • 设备hasOne DeviceGroup
  • Group hasMany Devices
  • DeviceGroup(属于设备和组)

现在,如果我$this->Device->find('all');,它会给我结果:

Device => array
DeviceGroup => array

现在我也想要Group表中的值,我该怎么做?

1 个答案:

答案 0 :(得分:1)

有几种方法可以实现这一目标。

可能很简单:

$this->Device->find('all', array('recursive' => 2));

但如果您有其他可以自动检索的模型,那么这可能会非常耗费资源并浪费资源。

另一种方法是将Group类添加到您的Device模型中:

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' => ''
  )
);

当您在查找中已经拥有Group时,尝试从另一个自动包含设备组关系的模型执行查找时,这可能会出现问题。所以最好在$ hasOne中给它命名,比如'DeviceGroupGroup',这很痛苦。

我首选的方法是启用Containable行为(我在app/app_model.php执行此操作,以便所有模型都自动包含启用):

class AppModel extends Model {
  var $actsAs = array('Containable');
}

然后无需将Group添加到设备模型中即可执行此操作:

$this->Device->find(
  'all',
  array(
    'contain' => array('DeviceGroup', 'Group'),
    'recursive' => 2,
  )
);

这样,即使您进行相对较深的递归,您也只是检索实际需要的模型,如果您还使用'fields'上的find参数,那么