2012-06-27 137 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;