我需要构建像“拥有多个用户”和“用户所属的多个群组”这样的关联。
但我无法获得正确的结果,而是使用错误的表格而不是 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')
));
我无法理解如何告诉蛋糕使用我的中间表并将重新附加到数组中。
答案 0 :(得分:1)
joinTable
不是hasMany
关联的有效配置密钥。我想你想拥有群组belongsToMany
用户。关于这一点的另一个线索是hasMany
是belongsTo
的“对立面”,而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',
]);