Я расширяю 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
и это не обнуляемо.
Что здесь происходит, я понятия не имею.
Что я здесь делаю не так и как это сделать правильно?
Вы должны установить значение по умолчанию явно, используя ->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
Других решений пока нет …