我想创建一个多对多关系,它们共享相同的连接表。我尝试了以下方法:
<?php
/** @Entity **/
class User
{
// ...
/**
* @ManyToMany(targetEntity="Group", inversedBy="users")
* @JoinTable(name="users_groups")
**/
private $groups;
// ...
}
/** @Entity **/
class Group
{
// ...
/**
* @ManyToMany(targetEntity="User", mappedBy="groups")
* @JoinTable(name="users_groups")
**/
private $users;
// ...
}
但是,当我尝试更新表时,这会返回以下错误:
[Doctrine\DBAL\Schema\SchemaException]
The table with name 'postgres.user_groups' already exists.
如何创建共享同一个表'user_groups'的多对多关系?
注意:我知道我可以移除@JoinTable(name="users_groups")
,但是当我这样做时,我不再拥有与两个拥有方的多对多关系。相反,只有一方(拥有方)知道联接表。
答案 0 :(得分:2)
从@JoinTable(name="users_groups")
的反面实体中删除Group
注释,一旦拥有边实体具有映射信息,则无需在反面实体中再次定义,某些关键点与之相关你的问题
反面必须使用OneToOne的mappedBy属性, OneToMany或ManyToMany映射声明。 mappedBy属性 包含所属方的关联字段的名称。
在 拥有方必须使用OneToOne的inversedBy属性, ManyToOne,或ManyToMany映射声明。 inversedBy属性 包含反面的关联字段的名称。
您可以自己选择多对多关联的拥有方
class Group
{
/**
* @ManyToMany(targetEntity="User", mappedBy="groups")
**/
private $users;
}
参见
Many-To-Many, Bidirectional
来自文档的例子