Yii2:添加ON UPDATE CURRENT_TIMESTAMP属性

问题描述 投票:3回答:1

我正在扩展yii\db\Migration类以添加一个方法timestamps,这将加速我创建迁移。它将在我将创建的每次迁移中添加所需的所有时间戳。

我在Laravel和CakePHP框架中看到了这个功能,我很好奇为什么在Yii 2 Migration Tool中默认不可用。

我尝试过以下方法:

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_TIMESTAMPdeleted_at可以为空,它的默认值是NULL

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

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

$this->addColumn(
    $tableName,
    'created_at',
    $this->timestamp()
);

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

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

我尝试过为qazxsw poi做以下事情,希望它会跟随qazxsw poi发生的事情:

updated_at

现在表中的默认值是:created_at,它不可为空。

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

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

php mysql yii2 database-migration
1个回答
3
投票

您需要使用$this->addColumn( $tableName, 'updated_at', $this->timestamp() ); 显式设置默认值,然后您需要以下列方式使用0000-00-00 00:00:00作为->defaultValue(null)参数,

->append('ON UPDATE CURRENT_TIMESTAMP')

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

$type

看到这些讨论 - $this->addColumn( $this->_table, 'updated_at', $this->timestamp()->defaultValue(null)->append('ON UPDATE CURRENT_TIMESTAMP') );

© www.soinside.com 2019 - 2024. All rights reserved.