2016-03-26 20 views
1

我在我的Laravel 5.1應用程序中有一組刪除語句,這些語句是放在事務中的。Laravel 5.1重定向在一個事務處理塊中

我有我的代碼如下,並試圖返回到同一頁面。但我得到一個空白頁。我的routes.php很好。

DB::transaction(function() use ($foo, $bar, $request) 
{ 
    // Delete from table abc 
    $deletedFoo = DB::delete('delete from abc where id = ' . $foo); 

    // Delete from table xyz 
    $deletedBar = DB::delete('delete from xyz where id = ' . $bar); 

    // Shows blank page 
    $request->session()->flash('changes_saved', 'Success! All your changes were saved.'); 
    return back(); 

}); 

但是,如果我把返回starement DB ::事務塊之外它工作正常。

DB::transaction(function() use ($foo, $bar)  
{ 
    // Delete from table abc 
    $deletedFoo = DB::delete('delete from abc where id = ' . $foo); 

    // Delete from table xyz 
    $deletedBar = DB::delete('delete from xyz where id = ' . $bar); 
}); 

// Goes back to the page with the message 
$request->session()->flash('changes_saved', 'Success! All your changes were saved.'); 
return back(); 

在我意識到需要將重定向放在事務之外之前,我嘗試了各種各樣的事情。但爲什麼?我是Laravel的新手,在這裏有點困惑。

回答

3

你必須使用return這樣的:

return DB::transaction(function() { 
    ... 
    return back(); 
}); 

要理解它,讓我們打破代碼:

$transaction = function ($foo, $bar, $request) 
{ 
    // ... 
    return back(); 
} 

return DB::transaction($transaction); // return is required here 

除非你返回DB::transaction呼叫控制器類,那麼它會不會是rreturned。因此,使用return這樣的:

public function controllerMethod() 
{ 
    return DB::transaction(...); // You must return 
} 

所以,只要把return keywork您DB::transaction(...)之前。此外,如果您控制交易外部的執行流程會更好,例如:

$result = DB::transaction(function() use ($foo, $bar) { 
    // ... 
    return true; 
}); 

if($result === true) { 
    return back(); 
} 
+0

如果我查看您的第一個片段,您將如何將您的返回返回(); ....對不起,如果這是一個愚蠢的問題。但是,如果你喜歡這樣,你不會看到你將如何重定向。 – KalC

+0

答案非常清楚,只需在'DB :: transaction(...);'之類的'DB :: transaction()'之前放置'return',剩下的代碼就會保持不變。 –

+1

工作!非常感謝。 – KalC