在创建迁移时,Doctrine多对多关系想要创建一个表两次

时间:2012-03-28 22:11:29

标签: doctrine symfony

在我描述我的问题之前,如果我从我得到的错误开始,它实际上可能会更清楚:

$ ./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_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_area关于userEntity/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_areamedia_area。)

1 个答案:

答案 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

我不确定这对你有什么帮助,但我想它至少会让你走上正轨。