2012-06-27 144 views
3

我有一个Gift实体,该实体具有发送和接收器...无论是从实体User 用户可以是许多礼物给其他用户发送。但也有接收器的许多礼物从许多用户Doctrine2 Symfony2的多个多对多关系

我看到它的样子,我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 

回答

3

如果没有两个连接表,你试图实现的是不可能的。

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

+0

感谢,让我怎么解决这个问题?对我来说很重要的是,接收者被识别出来,这很容易完成......但我怎样才能以清晰的方式识别发件人?解决方法? – Confidence

+1

完全错过了关于评论的通知,抱歉。 如果你有一个接收者 - 发送者结构,你可能想要使用一个带有两个字段的连接实体,一个指的是发送者,另一个指向接收者。这将删除您的@ ManyToMany'关系,并将其替换为一个实体,以便您可以指定关联。 – Ocramius

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;