2012-03-28 33 views
11

在我描述我的問題,它實際上可能更清楚,如果我開始,我發現了錯誤:學說多到許多關係要創建一個表兩次,當我創建一個遷移

$ ./app/console doc:mig:diff 

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

這是絕對正確的 - user_media_area確實存在。我在之前的遷移中創建了它,我不明白爲什麼Symfony正在嘗試再次創建表。

我的問題與多對多的關係有關。我有一個名爲user的表格,名爲media_area的表格和名爲user_media_area的表格。

下面的代碼,我告訴usermedia_areaEntity/User.php):

/** 
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas") 
* @JoinTable(name="user_media_area", 
*  joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@JoinColumn(name="media_area_id", referencedColumnName="id")} 
*  ) 
*/ 
private $mediaAreas; 

這裏的地方我告訴media_areauserEntity/MediaArea.php):

/** 
* @ORM\ManyToMany(targetEntity="User", mappedBy="users") 
*/ 
private $users; 

有趣的是,如果我刪除JoinTable東西從Entity/User.php,./app/console doctrine:migrations:diff將再次工作:

/** 
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas") 
*/ 
private $mediaAreas; 

但是,它有點關閉:它現在想創建一個名爲mediaarea的新表,我不想這樣做。我的桌子已經存在,它叫做media_area

所以看起來無論哪種方式,Symfony的是想在我User類來創建基於此ManyToMany事情表,唯一的原因,問題就解決了我刪除JoinTable是表的名稱就是了創建(mediaarea)不再與我的表的實際名稱(media_area)匹配。

所以我的問題是:它爲什麼要創建一個新的表?我究竟做錯了什麼?

(我知道這可能是我的命名約定關閉。Symfony和學說的數據庫實例是令人沮喪的缺乏多項列名的,所以我總是不知道如果我應該做的media_areamediaArea。 )

回答

4

根據官方文檔的解釋Association Mapping@JoinColumn@JoinTable定義通常是可選的,並且具有合理的默認值,是:

name: "<fieldname>_id" 
referencedColumnName: "id" 

從我們可以得出這樣的結論真的是沒有具體的區別你提出的兩個實現之間。

但是,當涉及到遷移時,表的創建是相當常見和預期的行爲。事情是表應該總是被刪除並重新創建,這是不會發生的。

關於表的名稱問題,原則2的這個默認行爲:

/** 
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas") 
*/ 
private $mediaAreas; 

是嘗試創建一個表名爲mediaarea。再次,完全正常。

如果你想爲一個實體的表聲明特定的名稱,你應該這樣做:

/** 
* @ORM\Table(name="my_table") 
*/ 
class Something 

我不知道有沒有什麼幫助你在所有的,但我想它讓你,至少在正確的軌道上。

+3

爲什麼這被標記爲答案?它沒有回答OP關於如何停止顯示錯誤的教義的問題。添加後,我得到了Doctrine \ Common \ Annotations \ AnnotationException:[Semantical Error] Annotation @ORM \ Table不允許在屬性User :: $ mediaAreas中聲明。您只能在這些代碼元素上使用這個註釋:CLASS。 – jaycode 2014-01-14 11:34:13

+0

您正試圖在屬性級別放置'@ ORM/Table'註釋,而它應該放在類級別上。錯誤與問題或答案無關。 – 2014-01-14 11:54:53

+0

正確的註釋是@ ORM/JoinTable – luliandro 2014-05-27 14:15:03

相關問題