Laravel DB :: транзакция не перехватывает исключение, используя события модели

Я довольно новичок в Laravel и пытаюсь работать с модельными событиями.
Рассмотрим модель с этими событиями (Обратите внимание на выброшенное вручную исключение):

class Doctor extends \Eloquent {

protected $fillable = ['name', 'summary', 'description', 'image'];

public static function boot() {
parent::boot();

Doctor::deleting(function(Doctor $doctor) {
$doctor->page()->delete();
});

Doctor::created(function(Doctor $doctor) {
throw new \Exception('hahahah!!!');
$doctor->page()->create(['title' => $doctor->name, 'slug' => $doctor->name]);
});
}

public function page() {
return $this->morphOne('Page', 'pageable');
}
}

Метод хранения контроллера:

public function store() {

// TODO : Extract Validation to a Service.

$validator = \Validator::make(
\Input::only('name'),
['name' => 'required']
);
if ($validator->fails()) {
return \Redirect::back()->withErrors($validator)->with(['items' => $this->dataArray]);
}
$doctor = \Doctor::create(\Input::all());

\DB::transaction(function() use($doctor) {
$doctor->save();
});

return \Redirect::route('Emc2.doctors.edit', ['id' => $doctor->id]);
}

Проблема в том, что DB :: транзакция не перехватывает это исключение, выброшенное моделью, и поэтому я не могу откатить транзакцию.

Я делаю что-то неправильно??

Любая помощь будет оценена!
Спасибо!

0

Решение

Работает как положено. Проблема заключается в том, что вы создаете новую запись перед ее переносом в транзакцию.

 $doctor = \Doctor::create(\Input::all()); // It already saved the doctor

\DB::transaction(function() use($doctor) {
$doctor->save(); // here you UPDATE doctor
});

Так что используйте это:

 $doctor = new \Doctor(\Input::all());

\DB::transaction(function() use($doctor) {
$doctor->save();
});

или же

 \DB::transaction(function() use (&$doctor) {
$doctor = \Doctor::create(\Input::all());
});
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]