yii2:加载项更新当前的\u时间戳属性

zpf6vheq  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(327)

我正在扩展 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 它不能为空。
这里发生了什么,我再也不知道了。
我做错了什么,怎么做才对?

euoag5mw

euoag5mw1#

您需要使用 ->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

相关问题