2015-04-30 65 views
1

我想创建一个共享同一个连接表的多对多关系。我试过如下:Symfony2多对多的关系共享一个JoinTable

[Doctrine\DBAL\Schema\SchemaException]       
    The table with name 'postgres.user_groups' already exists. 

如何创建一个多一对多的关系,共享相同的:

<?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; 

// ... 
} 

这,但是,当我尝试更新表返回以下错误表'user_groups'?

注意:我知道我可以删除@JoinTable(name="users_groups"),但是当我这样做时,我不再拥有与两个拥有方之间的多对多关系。相反,只有一方(拥有方)知道连接表。

回答

2

从是Group,一旦拥有方实体具有映射信息则没有必要在反侧实体再次定义,一些关键点的与此问题相关的反侧实体删除@JoinTable(name="users_groups")注释

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

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

你可以选择一个多一对多关联的拥有方自己

参考Bidirectional Associations

class Group 
{ 

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

} 

请参阅从文档Many-To-Many, Bidirectional 例如

+0

谢谢你你的答案。这通过创建一个拥有的一面和一个反面的方式起作用,但是,我希望能够创建两个拥有的一面。上面的注释让我可以做到这一点,但是当我更新SQL时,它会尝试两次创建连接表,这会引发上述错误。 该文档讨论了创建一个拥有两个拥有方的多对多但它没有详细介绍。 – Marcel

+0

@MarcelTjandraatmadja将有一个拥有和一个反面这两个实体不能拥有一方也从文档*原则只会检查协会的拥有方的变化*见第四点[*协会更新:拥有方和逆Side *](http://doctrine-orm.readthedocs.org/en/latest/reference/unitofwork-associations.html#association-updates-owning-side-and-inverse-side) –

+0

我明白了。那么如何在更新时自动更新连接表?即当一个组被添加到一个用户或当一个用户被添加到一个组。 – Marcel