Doctrine多对多关系希望在创建迁移时创建两次表
在我描述我的问题之前,如果我从我得到的错误开始,它实际上可能会让我更清楚:Doctrine多对多关系希望在创建迁移时创建两次表,doctrine,symfony,Doctrine,Symfony,在我描述我的问题之前,如果我从我得到的错误开始,它实际上可能会让我更清楚: $ ./app/console doc:mig:diff [Doctrine\DBAL\Schema\SchemaException] The table with name 'user_media_area' already exists. 这是绝对正确的-user\u media\u区域确实存在。我在上一次迁移中创建了它,我不明白为什么Symfony要再次创建该表 我
$ ./app/console doc:mig:diff
[Doctrine\DBAL\Schema\SchemaException]
The table with name 'user_media_area' already exists.
这是绝对正确的-user\u media\u区域确实存在。我在上一次迁移中创建了它,我不明白为什么Symfony要再次创建该表
我的问题与多对多关系有关。我有一个名为user
的表,一个名为media\u area
的表和一个名为user\u media\u area
的表
下面是我告诉user
关于media\u区域的代码(Entity/user.php
):
在这里,我告诉media\u area
关于user
(Entity/MediaArea.php
):
有趣的是,如果我从Entity/User.php
中删除JoinTable
内容,/app/console原则:migrations:diff
将再次工作:
/**
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas")
*/
private $mediaAreas;
但是,它有点不对劲:它现在想要创建一个名为mediaarea
的新表,我不想要它。我的表已经存在,名为media\u area
因此,不管是哪种方式,Symfony都试图基于我的User
类中的manytomy
创建一个表,当我删除JoinTable
时,问题消失的唯一原因是它想要创建的表的名称(mediaarea
)与我的表的实际名称不再匹配(媒体区域
)
所以我的问题是:它为什么要创建一个新表?我做错了什么?
(我知道我的命名约定可能不适用。Symfony和Doctrine的数据库示例令人沮丧地没有多个术语的列名,因此我并不总是知道我应该做media\u area
还是media area
)根据官方文件的解释,@JoinColumn
和@JoinTable
定义通常是可选的,并且具有合理的默认值,即:
name: "<fieldname>_id"
referencedColumnName: "id"
就是尝试创建一个名为mediaarea
的表。同样,这是非常正常的
如果要为实体的表声明特定名称,应执行以下操作:
/**
* @ORM\Table(name="my_table")
*/
class Something
我不确定这是否对您有帮助,但我想这至少让您走上了正确的道路。为什么这被标记为答案?它没有回答OP关于如何阻止条令显示错误的问题。添加此选项后,我得到了条令\Common\Annotations\AnnotationException:[语义错误]不允许在属性User:$mediaAreas上声明注释@ORM\Table。您只能在以下代码元素上使用此注释:CLASS。您试图将@ORM/Table
注释放在属性级别上,而它应该放在类级别上。错误与问题或答案无关。@DanielRibeiro实际上是这样的-您在属性上显示它是\@Table,这是不正确的。那么,如果您删除该表(drop),为什么它仍然说该表存在?
name: "<fieldname>_id"
referencedColumnName: "id"
/**
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas")
*/
private $mediaAreas;
/**
* @ORM\Table(name="my_table")
*/
class Something