Symfony Migrations Bundle 一遍又一遍地创建相同的迁移

问题描述 投票:0回答:2

我向这篇博文中的实体添加了一个自动更新时间戳,它工作得很好。

这里是代码片段:

#[Entity]
class Article
{
    #[Column(type: "datetime",
        columnDefinition: "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP",
        insertable: false,
        updatable: false,
        generated: "ALWAYS")]
    public $created;
}

我第一次运行

php bin/console make:migration
生成了正确的迁移:

$this->addSql('ALTER TABLE article ADD created TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');

这工作得很好,任何数据库更新现在都会更新

created
。然而,这也是问题开始的地方。每当我现在进行另一次迁移时,它都会尝试再次应用相同的更改:

$this->addSql('ALTER TABLE article CHANGE created created TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');

这怎么可能,有人知道如何解决这个问题吗?

非常感谢您的投入,我真的很感激。

php symfony doctrine symfony-cli
2个回答
0
投票

所以我没有弄清楚为什么会这样。但是解决这个问题的方法是检查有问题的属性是否已经存在,然后在 diffing 时忽略它:https://www.liip.ch/en/blog/doctrine-and-generated-columns


0
投票

Doctrine 看到您的实际列具有默认值,而在其映射的

options
中没有定义任何值(忽略您的
columnDefinition
)。因此,它决定需要生成一个 ALTER 迁移,并且在这样做时它确实考虑到了您的
columnDefinition
.

在列属性中设置

options: ["default" => "CURRENT_TIMESTAMP"]

#[Entity]
class Article
{
    #[Column(type: "datetime",
        columnDefinition: "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP",
        insertable: false,
        updatable: false,
        generated: "ALWAYS",
        options: ["default" => "CURRENT_TIMESTAMP"])]
    public $created;
}

或者,如果您只是通过 Doctrine 更改此表中的条目,则可以使用 Doctrine 生命周期事件 使创建/更新的时间戳字段保持最新。

© www.soinside.com 2019 - 2024. All rights reserved.