Как сделать атрибут ON UPDATE CURRENT_TIMESTAMP в миграциях Yii 2

Я расширяю 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 обнуляется, но это значение по умолчанию 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()
);

И да, поле не имеет значения NULL и содержит атрибут, который мне нужен. И это все еще не то, что мне нужно, потому что мне нужно поле nullable, за которым следует этот атрибут.

И, наконец, худшая часть …

Я пытался сделать следующее для updated_atв надежде на то, что последует за created_at:

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

Теперь значение по умолчанию в таблице: 0000-00-00 00:00:00 и это не обнуляемо.

Что здесь происходит, я понятия не имею.

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

0

Решение

Вы должны установить значение по умолчанию явно, используя ->defaultValue(null) и тогда вам нужно использовать ->append('ON UPDATE CURRENT_TIMESTAMP') следующим образом для $type параметр,

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

Выше будет показано поле в phpmyadmin, как показано ниже

введите описание изображения здесь

Смотрите эти обсуждения
https://github.com/bizley/yii2-migration/issues/6

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector