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