我向这篇博文中的实体添加了一个自动更新时间戳,它工作得很好。
这里是代码片段:
#[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');
这怎么可能,有人知道如何解决这个问题吗?
非常感谢您的投入,我真的很感激。
所以我没有弄清楚为什么会这样。但是解决这个问题的方法是检查有问题的属性是否已经存在,然后在 diffing 时忽略它:https://www.liip.ch/en/blog/doctrine-and-generated-columns
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 生命周期事件 使创建/更新的时间戳字段保持最新。