2012-03-28 63 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

相关问题