CakePHP关联关系表

时间:2017-06-30 15:53:20

标签: php mysql cakephp model-view-controller cakephp-3.0

我需要构建像“拥有多个用户”和“用户所属的多个群组”这样的关联。

但我无法获得正确的结果,而是使用错误的表格而不是 groups_relations

我的模特:

class GroupsTable extends Table
{
    public function initialize(array $config)
    {
        $this->setTable('groups');
        $this->setDisplayField('title');
        $this->setPrimaryKey('id');

        $this->hasMany('Users', [
            'joinTable'     => 'groups_relations',
            'foreignKey'    => 'user_id',
        ]);
    }
}


class UsersTable extends Table
{
    public function initialize(array $config)
    {
        $this->table('user_users');
        $this->belongsToMany('Groups', [
            'joinTable'     => 'groups_relations',
            'foreignKey'    => 'group_id',
        ]);

    }
}

class GroupsRelationsTable extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('groups_relations');
        $this->setDisplayField('group_id');
        $this->setPrimaryKey('id');

           $this->belongsTo('Groups', [
                'foreignKey' => 'group_id',
                'joinType'   => 'INNER'
                ]);

            $this->belongsToMany('Users', [
                'foreignKey' => 'user_id',
                'joinType'   => 'INNER'
                ]);

        }
}

我的表 groups_relations

id | group_id | user_id

我将查询运行为:

 $groupsWithUsers = $this->Groups->find('all', array(
        'contain' => array('Users')
        ));

我无法理解如何告诉蛋糕使用我的中间表并将重新附加到数组中。

2 个答案:

答案 0 :(得分:1)

joinTable不是hasMany关联的有效配置密钥。我想你想拥有群组belongsToMany用户。关于这一点的另一个线索是hasManybelongsTo的“对立面”,而belongsToMany是它自己的对立面。 (也就是说,如果A hasMany B,则B belongsTo A,但如果A belongsToMany B,则B belongsToMany A。)请注意,您还需要更改您的GroupsRelations与用户关联到belongsTo

这段代码是为您烘焙的吗?因为它应该知道更好。当我遇到粘性关联问题时,我有时会让Cake为我烘焙模型代码,然后看看结果与我写的有什么不同。

答案 1 :(得分:0)

不是试图以你正在做的方式使用关系,而是先从关系表中选择。这似乎更像Cake的做事方式。如果要恢复所有数据,可以排除条件子句。

$groupsWithUsers = $this->GroupsRelations->find('all', array(
    'contain' => ['Users', 'Groups'],
    'conditions' => ['Group.id' => $id]
    )
);

在进一步研究之后,我发现了一些我没有使用的东西,但似乎恰好适合你需要使用中间表的belongsToMany。在用户的表文件中,您将添加以下内容。类似的条目将添加到组页面。

    $this->belongsToMany('Groups', [
        'through' => 'GroupRelations',
    ]);