在我描述我的问题之前,如果我从我得到的错误开始,它实际上可能会更清楚:
$ ./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试图在ManyToMany
类中基于这个User
事件创建一个表,并且当我删除{{1}时问题消失的唯一原因它想要创建的表的名称(JoinTable
)不再与我的表的实际名称(mediaarea
)匹配。
所以我的问题是:为什么要创建一个新表呢?我做错了什么?
(我知道我的命名约定可能已经关闭.Symfony和Doctrine的数据库示例令人沮丧地没有多项列名,因此我并不总是知道我是否应该media_area
或media_area
。)
答案 0 :(得分:4)
根据官方文档的Association Mapping解释,@JoinColumn
和@JoinTable
定义通常是可选的,并且具有合理的默认值,即:
name: "<fieldname>_id"
referencedColumnName: "id"
由此我们可以得出结论,你提出的两个实现之间确实存在没有具体差异。
但是,在迁移时,表的创建是一种非常常见且预期的行为。事情是表应该总是被删除并再次创建,这不会发生。
关于表名问题,Doctrine 2关于此的默认行为:
/**
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas")
*/
private $mediaAreas;
尝试创建一个名为mediaarea
的表。再次,完全正常。
如果要为实体表声明特定名称,则应执行以下操作:
/**
* @ORM\Table(name="my_table")
*/
class Something
我不确定这对你有什么帮助,但我想它至少会让你走上正轨。