Doctrine2 symfony2多个多种关系

时间:2012-06-27 12:15:07

标签: symfony doctrine-orm

我有一个Gift实体,这个实体有一个发件人和一个接收器......都来自实体User 用户可以是向其他用户提供许多礼物的发件人。但也是来自许多用户的许多礼物的接收者

我看到它的方式,我的Gift实体内的解决方案将是这样的:

/**
 * @ORM\ManyToMany(targetEntity="Tracker\UserBundle\Entity\User")
 * @ORM\JoinTable(name="gift_user",
 *      joinColumns={@ORM\JoinColumn(name="sender_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="gift_id", referencedColumnName="id")}
 *      )
 */
protected $senders;

/**
 * @ORM\ManyToMany(targetEntity="Tracker\UserBundle\Entity\User")
 * @ORM\JoinTable(name="gift_user",
 *      joinColumns={@ORM\JoinColumn(name="receiver_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="gift_id", referencedColumnName="id")}
 *      )
 */
protected $receivers;

但是当我运行php app/console doctrine:schema:update --dump-sql时,我得到:

  [Doctrine\DBAL\Schema\SchemaException]                          
  The table with name 'finaldb.gift_user' already exists. 

我如何更改语法,配置,所以我最终得到这样的表?

gift_id | sender_id | receiver_id

2 个答案:

答案 0 :(得分:3)

如果没有两个连接表,您无法实现的目标。

每个@ManyToMany关联都需要不同的连接表。这是因为连接表除了两个链接实体之外不知道任何其他内容(不知道关联的方向)。此外,Doctrine ORM生成的连接表没有任何自动增量标识符,因为这两个引用已经代表了表的主键。

答案 1 :(得分:1)

这是东西: 您可以使用joinTable来指定连接表名称

/**
     * @ORM\ManyToMany(targetEntity="Tracker\UserBundle\Entity\User")
     * @ORM\JoinTable(name="gift_user",joinTable="myprefix_mytable_senders",
     *      joinColumns={@ORM\JoinColumn(name="sender_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="gift_id", referencedColumnName="id")}
     *      )
     */
    protected $senders;

    /**
     * @ORM\ManyToMany(targetEntity="Tracker\UserBundle\Entity\User")
     * @ORM\JoinTable(name="gift_user",joinTable="myprefix_mytable_receivers"
     *      joinColumns={@ORM\JoinColumn(name="receiver_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="gift_id", referencedColumnName="id")}
     *      )
     */
    protected $receivers;
相关问题