Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii2:添加更新当前\u时间戳属性_Php_Mysql_Yii2_Database Migration - Fatal编程技术网

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
值意味着插入,而不是更新。