我正在扩展 yii\db\Migration
类来添加方法 timestamps
这将加快我创建迁移的速度。它将在我创建的每个迁移中添加我需要的所有时间戳。
我在laravel和cakephp框架中看到了这个功能,我很好奇为什么在yii2迁移工具中默认不提供这个功能。
我尝试了以下方法:
namespace custom\db;
use \yii\db\Migration as YiiMigration;
class Migration extends YiiMigration
{
public function timestamps($tableName)
{
$this->addColumn(
$tableName,
'created_at',
$this->timestamp()->null()->defaultExpression('CURRENT_TIMESTAMP')
);
$this->addColumn(
$tableName,
'updated_at',
$this->timestamp()->null()
);
$this->addColumn(
$tableName,
'deleted_at',
$this->timestamp()->null()->defaultExpression('NULL')
);
}
}
在我的实际迁移中 up
或者 safeUp
方法i执行以下操作:
public function safeUp()
{
$this->createTable('test', [
'id' => 'pk',
]);
$this->timestamps('test');
}
当我运行这个时,fields created_at
以及 deleted_at
获取指定的类型和默认值。 created_at
可为null,但其默认值为 CURRENT_TIMESTAMP
以及 deleted_at
可为null,其默认值为 NULL
.
问题在于 updated_at
现场。我不知道如何使用yii 2迁移设置该字段的属性,我需要设置: ON UPDATE CURRENT_TIMESTAMP
属性,该属性在更新记录时将始终更改值。
现在,这更进一步。当我只使用 created_at
字段,并使用以下选项,该字段将始终获得属性 ON UPDATE CURRENT_TIMESTAMP
:
$this->addColumn(
$tableName,
'created_at',
$this->timestamp()
);
是的,这个字段不能为null,它包含了我需要的属性。这仍然不是我需要的,因为我需要字段nullable,后跟那个属性。
最后,最糟糕的是。。。
我试着做了以下几件事 updated_at
,希望它能跟随发生的一切 created_at
:
$this->addColumn(
$tableName,
'updated_at',
$this->timestamp()
);
现在表中的默认值是: 0000-00-00 00:00:00
它不能为空。
这里发生了什么,我再也不知道了。
我做错了什么,怎么做才对?
1条答案
按热度按时间fhg3lkii1#
您需要使用
->defaultValue(null)
然后你需要使用->append('ON UPDATE CURRENT_TIMESTAMP')
以以下方式$type
参数,上面将显示phpmyadmin中的字段,如下所示
看看这些讨论-https://github.com/bizley/yii2-migration/issues/6