在CakePHP 2.0中,我们有一个Subscriber模型和一个SubscriberGroup模型。它们都是HABTM相互联系的。
在我们的SubscriberGroup编辑操作中,我们希望获得该组中的订阅者列表,这在定义HABTM关系时不是问题。但是,关联表subscriber_groups_subscribers也有一个author_id字段,它是另一个表的外键 - 用户。
因此,当我们执行$ this-> SubscriberGroups-> read()时,我们不仅要获得组和订阅者,还要获取users表中有关创建连接的用户的详细信息。
HABTM关系定义如下:
public $hasAndBelongsToMany = array(
'Subscriber' => array(
'className' => 'Subscriber',
'joinTable' => 'subscriber_groups_subscribers',
'foreignKey' => 'subscriber_group_id',
'associationForeignKey' => 'subscriber_id',
'fields' => 'id,first_name,last_name,email_address,last_error',
'unique' => 'keepExisting'
)
);
有没有办法在不定义自定义查询的情况下执行此操作?
答案 0 :(得分:0)
嗯,要实现这一点,您可能想要使用containable behavior:
$options = array(
'contain' => array(
'Subscriber', 'Author'
)
);
$data = $this->SubscriberGroup->find('all', $options);
并且不要忘记为SubscriberGroup模型设置可包含的行为!
class SubscriberGroup extends AppModel {
public $actsAs = array('Containable');
}
答案 1 :(得分:0)
我认为使用CakePHP无法与3个表建立HABTM
关系,即使HABTM
有一个额外字段也很复杂。
最简单的方法是创建“链接”模型并在hasOne
模型上添加SubscriberGroup
关系:
class LinkModel extends AppModel {
public $useTable = 'subscriber_groups_subscribers' ;
public $actAs = array('Containable') ;
public $belongsTo = array(
'Subscriber',
'Author',
'SubscriberGroup'
) ;
}
class SubscriberGroup extends AppModel {
public $actAs = array('Containable') ;
public $hasMany = array(
'LinkModel'
) ;
}
然后,通过调用read
来获取此信息:
$this->SubscriberModel->recursive = 2 ;
$res = $this->SubscriberModel->read(null, 1) ;
debug($res) ;
输出:
array(
'SubscriberGroup' => array(
'id' => '1'
),
'LinkModel' => array(
(int) 0 => array(
'id' => '2',
'author_id' => '1',
'subscriber_id' => '3',
'subscriber_group_id' => '1',
'Subscriber' => array(
'id' => '3'
),
'Author' => array(
'id' => '1'
),
'SubscriberGroup' => array(
'id' => '1'
)
),
(int) 1 => array(
'id' => '3',
'author_id' => '1',
'subscriber_id' => '1',
'subscriber_group_id' => '1',
'Subscriber' => array(
'id' => '1'
),
'Author' => array(
'id' => '1'
),
'SubscriberGroup' => array(
'id' => '1'
)
),
(int) 2 => array(
'id' => '4',
'author_id' => '2',
'subscriber_id' => '1',
'subscriber_group_id' => '1',
'Subscriber' => array(
'id' => '1'
),
'Author' => array(
'id' => '2'
),
'SubscriberGroup' => array(
'id' => '1'
)
)
)
)