gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:47:48 24 4
gpt4 key购买 nike

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

$ ./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;

有趣的是,如果我从 Entity/User.php 中删除 JoinTable 内容,./app/consoledoctrine:migrations:diff 将再次工作:

/**
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas")
*/
private $mediaAreas;

但是,它有点偏离:它现在想要创建一个名为 mediaarea 的新表,但我不想要它。我的表格已存在,名为 media_area

所以看起来无论哪种方式,Symfony 都试图在我的 User 类中基于这个 ManyToMany 事物创建一个表,这是问题消失的唯一原因我删除 JoinTable 是因为它要创建的表的名称 (mediaarea) 不再与我的表的实际名称 (media_area) 匹配)。

所以我的问题是:为什么它要创建一个新表?我做错了什么?

(我知道我的命名约定可能不正确。令人沮丧的是,Symfony 和 Doctrine 的数据库示例缺乏多术语列名称,因此我并不总是知道我是否应该执行 media_areamediaArea。)

最佳答案

根据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

我不确定这是否对您有帮助,但我想它至少会让您走上正确的道路。

关于Doctrine多对多关系想要在创建迁移时创建两次表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9916391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com