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