Однако, уже не первый раз нарываюсь на примерно такоеСамый простой способ реализации транзакций миграций это прописать код миграций в методы safeUp() и safeDown(). Эти два метода отличаются от методов up() и down() тем, что они неявно заключены в транзакции. В результате, если какая-либо операция в этих методах не удается, все предыдущие операции будут отменены автоматически.
Код: Выделить всё
public function safeUp()
{
$this->addColumn('{{%zn_worker}}', 'work_guid', $this->string(36)->notNull());
// creates index for column `guid`
$this->createIndex(
'{{%idx-zn_worker-work_guid}}',
'{{%zn_worker}}',
'work_guid'
);
// add foreign key for table `{{%zn_work}}`
$this->addForeignKey(
'{{%fk-zn_worker-work_guid}}',
'{{%zn_worker}}',
'work_guid',
'{{%zn_work}}',
'guid',
'CASCADE'
);
Опять же, опираясь на документацию, ожидаю, что и колонка добавлена не будет, однако даже при обломавшейся миграции колонка остается в таблице, вызывая ошибку при последующих применениях этой миграции после исправления логических ошибок в виде добавления уникального индекса в родительскую таблицу. Это бага или фича?