CakePHP:从HABTM连接表中检索关联

时间:2014-07-15 09:47:56

标签: cakephp

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

有没有办法在不定义自定义查询的情况下执行此操作?

2 个答案:

答案 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'
            )
        )
    )
)