我正在扩展 yii\db\Migration
类以添加一个方法 timestamps
这将加快我创建迁移的速度。它将在我将创建的每个迁移中添加我需要的所有时间戳。
我已经在 Laravel 和 CakePHP 框架中看到了这个功能,我很好奇为什么在 Yii 2 迁移工具中默认情况下不可用。
我尝试了以下方法:
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
方法中的实际迁移中,我执行以下操作:public function safeUp()
{
$this->createTable('test', [
'id' => 'pk',
]);
$this->timestamps('test');
}
当我运行它时,字段
created_at
和 deleted_at
获得指定的类型和默认值。 created_at
可以为空,但它的默认值是 CURRENT_TIMESTAMP
并且 deleted_at
可以为空,它的默认值是 NULL
。问题在于
updated_at
字段。我不知道使用 Yii 2 迁移为该字段设置属性的方法,我需要设置:ON UPDATE CURRENT_TIMESTAMP
属性,它会在更新记录时始终更改值。现在,这更进一步。当我仅使用
created_at
字段和以下选项测试此功能时,该字段将始终获得属性 ON UPDATE CURRENT_TIMESTAMP
:$this->addColumn(
$tableName,
'created_at',
$this->timestamp()
);
是的,该字段不可为空,它包含我需要的属性。这仍然不是我需要的,因为我需要可以为空的字段,然后是该属性。
最后,最糟糕的部分......
我已尝试为
updated_at
执行以下操作,希望它会遵循 created_at
发生的情况:$this->addColumn(
$tableName,
'updated_at',
$this->timestamp()
);
现在表中的默认值是:
0000-00-00 00:00:00
并且它不可为空。这里发生了什么,我不再有任何线索。
我在这里做错了什么以及如何正确地做到这一点?
最佳答案
您需要使用 ->defaultValue(null)
显式设置默认值,然后您需要按以下方式为 ->append('ON UPDATE CURRENT_TIMESTAMP')
参数使用 $type
,
$this->addColumn(
$this->_table,
'updated_at',
$this->timestamp()->defaultValue(null)->append('ON UPDATE CURRENT_TIMESTAMP')
);
以上将向您显示 phpmyadmin 中的字段,如下所示
查看这些讨论
- https://github.com/bizley/yii2-migration/issues/6
关于php - Yii2 : Add ON UPDATE CURRENT_TIMESTAMP attribute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53823120/