2016-03-26 14 views
1

トランザクション内に配置したLaravel 5.1アプリケーションにdelete文のセットがあります。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(); 

}); 

しかし、私がDB :: transactionブロックの外に返品starementを置くとうまくいきます。

トランザクション外にリダイレクトする必要があることを知る前に、さまざまなことを試しました。しかし、なぜ?私はララベルには新しく、ちょっと混乱しています。

答えて

3

あなたはこのようにリターンを使用する必要があります。それはのは、コードを壊してみましょう理解するために

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

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

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

あなたのコントローラクラスにDB::transactionコールを返していない限り、それはできないでしょうrreturned。したがって、このようなリターンを使用します。

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

ので、ちょうどあなたのDB::transaction(...)return keyworkを置きます。また、トランザクション外からの実行フローを制御するとよいでしょう。例:

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

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

私はあなたの最初のスニペットを見れば、どのようにあなたのリターンを戻しますか? ....それはばかな質問であれば申し訳ありません。しかし、あなたがこれを好きなら、どのようにリダイレクトするのか分かりません。 – KalC

+0

答えは非常に明確です。単に 'return'を' DB :: transaction() 'のような' DB :: transaction() 'の前に置いてください。 –

+1

Worked!どうもありがとう。 – KalC