Я создаю систему резервного копирования, но у меня возникла проблема с шагом импорта. Невозможно откатить, если есть какая-либо ошибка.
Я использую этот код в режиме CLI (через ремесленник моя команда)
У меня есть файл со всеми моими инструкциями:
<?php
// @generated 2016-12-11 01:05:25
use Illuminate\Support\Facades\DB;
use App\Category;
// ...
DB::beginTransaction();
Category::truncate();
// ...
// LOAD MODEL `Category` (CLASS `App\Category`)
Category::unguard();
Category::create(array (
'id' => 1,
'name' => 'Holidays',
'descr' => 'Holidays & sick & off',
'color' => 'default',
'created_at' => '2016-12-11 01:05:21',
'updated_at' => '2016-12-11 01:05:21',
));
// ...
Category::reguard();
// ...
DB::rollback();
?>
Если я выполняю этот код, это похоже на откат 🙁 Если я очищаю свою таблицу и выполняю сценарий … данные вставляются.
Согласно документации Laravel, инструкция отката должна быть совместимой:
Использование методов транзакций фасада БД также контролирует транзакции
для построителя запросов и Eloquent ORM (https://laravel.com/docs/5.3/database).
Я также пытался использовать DB ::action () (с ошибкой вручную (изменено) id
от ida
) для запуска отката). Нет разницы.
Есть ли у вас какие-либо объяснения? Или любой способ правильно выполнить инструкцию отката?
Спасибо 🙂
try {
DB::beginTransaction();
include $file;
/*** File is:
* use Illuminate\Support\Facades\DB;
* use App\Category;
*
* Category::truncate();
* Category::unguard();
* Category::create(array ('id' => 1, 'name' => 'Holidays'));
* // create error by changing 'id' by 'ida'
* Category::reguard();
***/
DB::commit();
echo sprintf('> Load Backup file `%s` COMPLETED', $file);
}
catch( \Exception $e ) {
DB::rollback();
echo sprintf('> Load file `%s` failled - ROLLBACK', $file);
throw $e;
}
DB::transaction(function() {
include $file;
/*** File is:
* use Illuminate\Support\Facades\DB;
* use App\Category;
*
* Category::truncate();
* Category::unguard();
* Category::create(array ('id' => 1, 'name' => 'Holidays'));
* // create error by changing 'id' by 'ida'
* Category::reguard();
***/
});
Такой же как тест 1, include $file
и все DB::transaction
, DB::beginTransaction
& DB::commit
& DB:rollback
прямо в этом файле $ file
Я пытался:
php artian migrate:refresh --seed
Очистить таблицы & заполнить некоторыми masterdataЯ думаю, что это должно быть
DB::beginTransaction();
try
{
//code for processing multiple related transactions
include $file;
}
catch(\Exception $e)
{
DB::rollBack();
//echo error message
}
DB::commit();
//echo success message
DB::beginransaction
and DB::commit
должен быть вне блока try-catch. Меня устраивает.
И ваш $ файл должен содержать только те инструкции, которые вы хотите получить в блоке try — никаких операторов DB :: beginTransaction (), DB :: commit () или DB :: rollBack ().
ОБНОВИТЬ
Основные логические шаги, которые необходимо выполнить
DB::beginTransaction()
try{//run queries}
catch(Exception $e){ DB::rollBack()
//display/send error/exception message }
DB::commit()
Надеюсь это поможет.
Других решений пока нет …