2015-11-04 34 views
2

我与Worker和Area有外交关系。试图摧毁外国使用记录laravel时的警告消息5.1

很显然,当你想删除一个Area并且它已经被分配时,Laravel会抛出一个错误。

我想添加一个警告,表明他不能这样做,所以我成功地做到这一点的用户:

public function destroy($id) 
{ 
    $area = Area::findOrFail($id); 
    $workers = Worker::all(); 

    foreach ($workers as $worker) 
    { 
     if ($worker->area_id == $id) 
     { 
      $match = 'found'; 
     } 
    } 

    if ($match == 'found') 
    { 
     \Session::flash('alert-danger', 'No puedes eliminar area relacionada con empleado, elimina primero el empleado!'); 

     return redirect()->route('areas.index'); 
    } else 
    { 
     $area->delete(); 
     \Session::flash('alert-success', 'Area eliminada correctamente!'); 

     return redirect()->route('areas.index'); 
    } 
} 

为了解释上面的代码,我首先循环通全体职工和比较workers.area_idareas.id,如果发现匹配,它将被存储在$match变量中。

然后,如果匹配已被“找到”,我使用Laravel的闪光灯向用户发送消息,告诉他他不能删除该区域,因为它与工作人员相关,然后重定向到索引。否则,破坏该区域并重定向。

这有效,它是okey,我只是想知道,如果Laravel已经实施了一些类来管理这种情况。昨天你们帮助我的雄辩,现在我有大约100行代码:)

谢谢你提前!

回答

2

解决方法一:让它级联删除,因此,如果您删除父,孩子们被删除过:

$table->foreign('worker_id')->references('id')->on('workers')->onDelete('cascade'); 

如果你不想这样做,你可以只捕获异常,而不是先循环:

public function destroy($id) { 
    $area = Area::findOrFail($id); 
    try { 
     $area->delete(); 
     \Session::flash('alert-success', 'Area eliminada correctamente!'); 
    } catch (Illuminate\Database\QueryException $e) { 
     \Session::flash('alert-danger', 'No puedes eliminar area relacionada con empleado, elimina primero el empleado!'); 
    } 
    return redirect()->route('areas.index'); 
} 

这可能是错误的例外,但我认为这是它引发的。而我的级联语法可能是错误的,有一段时间没有使用Laravel。但是,这两个方面的总体思路我会做

1

我认为戴维的第二种解决方案是好,但我想补充的东西检查误差的完整性约束违规:

catch (Illuminate\Database\QueryException $e){ 
if($e->getCode() == "23000"){ 
    \Session::flash('alert-danger', 'No puedes eliminar area relacionada con empleado, elimina primero el empleado!'); 
}} 

代码23000是违反完整性约束的sql代码,所以这样我们只能避免完整性约束违规。