在我描述我的问题,它实际上可能更清楚,如果我开始,我发现了错误:学说多到许多关系要创建一个表两次,当我创建一个迁移
$ ./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
的表格。
下面的代码,我告诉user
约media_area
(Entity/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_area
约user
(Entity/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_area
或mediaArea
。 )
为什么这被标记为答案?它没有回答OP关于如何停止显示错误的教义的问题。添加后,我得到了Doctrine \ Common \ Annotations \ AnnotationException:[Semantical Error] Annotation @ORM \ Table不允许在属性User :: $ mediaAreas中声明。您只能在这些代码元素上使用这个注释:CLASS。 – jaycode 2014-01-14 11:34:13
您正试图在属性级别放置'@ ORM/Table'注释,而它应该放在类级别上。错误与问题或答案无关。 – 2014-01-14 11:54:53
正确的注释是@ ORM/JoinTable – luliandro 2014-05-27 14:15:03