Yii2: добавить атрибут ON UPDATE CURRENT_TIMESTAMP - PullRequest
0 голосов
/ 18 декабря 2018

Я расширяю класс 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')
        );
    }
}

В моей реальной миграции по методу up или safeUp я делаю следующее:

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

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

Когда я запускаю этополя 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, и оно не может обнуляться.

Чтоздесь происходит, у меня нет никакой подсказки.

Что я здесь не так делаю и как это сделать правильно?

1 Ответ

0 голосов
/ 18 декабря 2018

Вам необходимо явно установить значение по умолчанию, используя ->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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...