Php Yii2:添加更新当前\u时间戳属性
我正在扩展Php Yii2:添加更新当前\u时间戳属性,php,mysql,yii2,database-migration,Php,Mysql,Yii2,Database Migration,我正在扩展yii\db\Migration类以添加一个方法timestamps,它将加快我创建迁移的速度。它将在我将创建的每个迁移中添加我需要的所有时间戳 我在Laravel和CakePHP框架中看到了这个功能,我很好奇为什么在Yii 2迁移工具中默认情况下不提供这个功能 我尝试了以下方法: namespace custom\db; use \yii\db\Migration as YiiMigration; class Migration extends YiiMigration {
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')
);
}
}
public function safeUp()
{
$this->createTable('test', [
'id' => 'pk',
]);
$this->timestamps('test');
}
在使用up
或safeUp
方法进行实际迁移时,我执行以下操作:
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')
);
}
}
public function safeUp()
{
$this->createTable('test', [
'id' => 'pk',
]);
$this->timestamps('test');
}
当我运行此操作时,在处创建的字段和在处删除的字段将按指定获取其类型和默认值<在处创建的代码可为空,但其默认值为当前时间戳,在
处删除的代码可为空,其默认值为空
问题在于字段中的updated\u。我不知道如何使用Yii 2迁移来设置该字段的属性,我需要设置:ON UPDATE CURRENT_TIMESTAMP
属性,该属性在更新记录时始终会更改值
现在,这更进一步。当我仅在
字段中使用created\u并使用以下选项测试此功能时,该字段在更新当前时间戳时将始终获得属性:
$this->addColumn(
$tableName,
'created_at',
$this->timestamp()
);
是的,该字段不可为空,它包含我需要的属性。这仍然不是我需要的,因为我需要字段nullable,后跟该属性
最后,最糟糕的是
我已尝试在
上对
更新的(u)执行以下操作,希望它能遵循上创建的(u)(u)所发生的事情:
$this->addColumn(
$tableName,
'updated_at',
$this->timestamp()
);
现在,表中的默认值是:0000-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中的字段,如下所示
看看这些讨论
-不需要添加->追加()?我在使用timestamp()时自动设置为UPDATE,或者这是因为您在创建数据表后添加了字段?我的代码:
'update\u time'=>$this->timestamp()->notNull()->comment('更新时间')代码>,在数据库中:update\u time timestamp default CURRENT\u timestamp not null on update CURRENT\u timestamp comment'更新时间'代码>另一种方法是使用defaultExpression()
@PrabowoMurti,它表示default
值意味着插入,而不是更新。