2014-09-22 96 views
0

我對Laravel相當陌生,我正在嘗試使用Model事件。 考慮一個模型具有這些事件(注意,手動拋出的異常)Laravel DB ::事務不會使用模型事件捕獲異常

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 ::交易犯規趕上拋出異常由模型,所以我不能回滾交易。

我做錯了什麼?

任何幫助將不勝感激! 謝謝!

回答

2

它按預期工作。問題在於你在交易中包裝它之前創建了新的條目。

$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()); 
}); 
+0

絕對!多麼愚蠢的我:)謝謝! – 2014-09-22 15:17:48