我有一个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
答案 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;