Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 13.03.2016 18:06:53

Транзакции

Здравствуйте. Использую Laravel 5.2. Возникла проблема с транзакцией
protected function create(array $data, $basket){
    DB::transaction(function() use ($data, $basket){
        try{
            $order = Orders::create([
                'name' => $data['name'],
                'phone' => $data['phone'],
                'adress' => $data['adress'],
            ]);
            $basket->each(function($item, $key) use ($order){
                Goods::create([
                    'order' => $order->id,
                    'good' => $item->get('id'),
                    'quantity' => $item->get('quantity'),
                ]);
            });
        }
        catch(Exception $e){
            DB::rollback();
        }
    });
}
При добавлении в таблицу Goods я делаю ошибку и получаю QueryException. Но в таблицу Orders данные все равно добавляются. Что я делаю не так?

Не в сети

#2 14.03.2016 06:34:56

duster
Откуда: Мельбурн
Сообщений: 148

Re: Транзакции

Для начала, у Вас вообще нет DB::commit() — вы нигде транзакцию не завершаете?

Если верить документации, что работа с Eloquent должна нормально заворачиваться в транзакцию DB.

Еще у Вас опечатка в методе rollback() — он на самом деле rollBack(). В Laravel везде используется camel case.

Не в сети

#3 14.03.2016 06:52:12

Re: Транзакции

DB::commit() пока нету, потому что я хочу для начала отменить транзакцию.
Если верить документации, то при использовании синтаксиса DB::transaction(function() {...}); вообще не нужно ни rollback, ни commit. Но ни так ни так не добился должного результата.
Пробовал и в камэлКэйсе и так, но результат один и тот же. И не появляется ошибка что метьод не найден.

Не в сети

#4 14.03.2016 07:10:20

Re: Транзакции

DB::beginTransaction();
try{
    $order = DB::table('orders')->insertGetId([
        'name' => $data['name'],
        'phone' => $data['phone'],
        'adress' => $data['adress'],
    ]);
    DB::table('goods')->insert([
    'order' => $order,
    'good' => $data['phone'],
    'quantity' => $data['phone'],
    ]);
}
catch(QueryException $e){
    DB::rollBack();
}
DB::commit();

Никакого эффекта.

Не в сети

#5 14.03.2016 08:20:11

Re: Транзакции

Решил проблему. Она оказалась в том, что таблицы были в MyIsam. Поставил в InnoDB и все стало работать.

Не в сети

#6 14.03.2016 16:15:43

duster
Откуда: Мельбурн
Сообщений: 148

Re: Транзакции

MadHatter пишет:

Решил проблему. Она оказалась в том, что таблицы были в MyIsam. Поставил в InnoDB и все стало работать.

Это грустно - MyISAM иногда нужен. К примеру, InnoDB не поддерживает spatial-индексы.

Не в сети

Подвал раздела