Даже если вы или кто-то другой «примонтировал» доктрину к проекту Yii2 (такое в принципе
возможно), то это не означает, что не нужно понимать смысл миграций. Как уже сказал,
Максим Федоров,
миграции нужны для версионирования базы данных. Использовать версионирование (миграции) БД как команду -
глупая затея.
Кроме того, миграции
не должны работать с данными, они версионируют только схему. На рабочем проекте, с данными, вы работаете: через скрипты, SQL запросами и т.д.
К примеру. Вы скачали проект из репозитория. Создали пустую базу данных. Подключили к проекту. Применяете миграции, а они выдают ошибку, связанную с миграцией
данных которых у вас нет. Это понятно?
Дак как же вам организовать работу заказчика не через консоль, а через веб интерфейс? Пойти можно двумя способами:
- С помощью Web скрипта. Создать методы в контроллере, которые будут удалять данные, изменять автоикремент напрямую, как при работе с обычными данными. У вас получится некая обертка над базой. Работайте хоть через простой SQL запрос или используя Доктрину, но это не должно быть с помощью миграций!
- С помощью консольного скрипта и очереди. Сделать тоже самое что и в первом варианте, только при вызове метода в контроллере вы не удаляете данные, а закидываете задачу в очередь: "Удали мне все данные из таблицы". Очередь запускается по крону, например, каждые 5 минут. Заказчик видит статус очередей по своим командам: в очереди, в работе, выполнено. Можно пойти и без очередей, но так будет лучше и у заказчика будет обратная связь.
Когда использовать второй вариант? Тогда, когда у вас могут возникнуть ошибки по лимиту памяти. Как правило, это работа с большими данными.
Например, если в вашей таблице 10 записей, то такой процесс легко можно запустить через обычный Web-овский скрипт. Но если у вас в БД 10 000 000 млн. записей, то у вас возникнет ошибка по лимиту памяти. Про 10 млн. написал преувеличено. Ошибка может возникать и с меньшим количеством данных. Всё зависит от вашего лимита памяти и самой операции.
Пример запуска скрипта из приложения без очередей используя
exec:
class AdminController extends \yii\web\Controller
{
public function actionIndex()
{
return $this->render('index');
}
public function actionComposerUpdate()
{
return $this->commandExec('composer update');
}
public function actionComposerInstall()
{
return $this->commandExec('composer install');
}
public function actionComposerSelfUpdate()
{
return $this->commandExec('composer self-update');
}
private function commandExec($command)
{
$projectPath = \Yii::getAlias('@app');
$exec = "cd {$projectPath} && {$command}";
exec($exec, $resultArray);
if ($resultArray){
\Yii::$app->getSession()->setFlash('info', implode("<br>", $resultArray));
}
return $this->redirect('index');
}
}