Symfony2多对多关系共享一个JoinTable

时间:2015-04-30 06:46:37

标签: symfony doctrine-orm many-to-many

我想创建一个多对多关系,它们共享相同的连接表。我尝试了以下方法:

<?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"),但是当我这样做时,我不再拥有与两个拥有方的多对多关系。相反,只有一方(拥有方)知道联接表。

1 个答案:

答案 0 :(得分:2)

@JoinTable(name="users_groups")的反面实体中删除Group注释,一旦拥有边实体具有映射信息,则无需在反面实体中再次定义,某些关键点与之相关你的问题

  

反面必须使用OneToOne的mappedBy属性,   OneToMany或ManyToMany映射声明。 mappedBy属性   包含所属方的关联字段的名称。

     

在   拥有方必须使用OneToOne的inversedBy属性,   ManyToOne,或ManyToMany映射声明。 inversedBy属性   包含反面的关联字段的名称。

     

您可以自己选择多对多关联的拥有方

参考Bidirectional Associations

class Group
{

    /**
     * @ManyToMany(targetEntity="User", mappedBy="groups")
     **/
    private $users;

}
  

参见Many-To-Many, Bidirectional   来自文档的例子