Yii2 : 添加 ON UPDATE CURRENT_TIMESTAMP 属性

ome*_*itz 4 php mysql database-migration yii2

我正在扩展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')
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    $this->timestamps('test');
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,字段created_atdeleted_at按照指定获取它们的类型和默认值。created_at可以为空,但它的默认值是CURRENT_TIMESTAMP并且可以deleted_at为空,它的默认值是NULL

问题是updated_at字段。我不知道如何使用 Yii 2 迁移为该字段设置属性,我需要设置:ON UPDATE CURRENT_TIMESTAMP属性,它会在更新记录时始终更改值。

现在,这更进一步。当我仅使用 usingcreated_at字段和以下选项测试此功能时,该字段将始终获得属性ON UPDATE CURRENT_TIMESTAMP

$this->addColumn(
    $tableName,
    'created_at',
    $this->timestamp()
);
Run Code Online (Sandbox Code Playgroud)

是的,该字段不可为空,它包含我需要的属性。这仍然不是我需要的,因为我需要可以为空的字段,然后是该属性。

最后,最糟糕的部分......

我已尝试为 执行以下操作updated_at,希望它会遵循发生的事情created_at

$this->addColumn(
    $tableName,
    'updated_at',
    $this->timestamp()
);
Run Code Online (Sandbox Code Playgroud)

现在表中的默认值是:0000-00-00 00:00:00并且它不可为空。

这里发生了什么,我不再有任何线索。

我在这里做错了什么以及如何正确地做到这一点?

Muh*_*lam 6

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

$this->addColumn(
    $this->_table,
    'updated_at',
    $this->timestamp()->defaultValue(null)->append('ON UPDATE CURRENT_TIMESTAMP')
);
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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