3

我有一个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
4

2 回答 2

3

如果没有两个连接表,您想要实现的目标是不可能的。

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

于 2012-06-27T12:26:07.217 回答
2

这是东西:您可以使用 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;
于 2012-06-27T15:30:35.650 回答