Yii2:添加ON UPDATE CURRENT_TIMESTAMP属性

时间:2018-12-17 21:17:56

标签: 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
{
    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')
        );
    }
}

在以upsafeUp方法进行的实际迁移中,我执行以下操作:

public function safeUp()
{
    $this->createTable('test', [
        'id' => 'pk',
    ]);

    $this->timestamps('test');
}

运行此命令时,字段created_atdeleted_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,并且它不能为空。

这里发生了什么,我没有任何头绪了。

我在这里做错什么以及如何正确做?

1 个答案:

答案 0 :(得分:3)

您需要使用->defaultValue(null)显式设置默认值,然后需要对->append('ON UPDATE CURRENT_TIMESTAMP')参数使用以下方式使用$type

$this->addColumn(
    $this->_table,
    'updated_at',
    $this->timestamp()->defaultValue(null)->append('ON UPDATE CURRENT_TIMESTAMP')
);

上面将向您显示phpmyadmin中的字段,如下所示

enter image description here

查看这些讨论 -https://github.com/bizley/yii2-migration/issues/6