Gov*_*row 5 php transactions laravel laravel-5
我DB::beginTransaction()在Laravel中使用但它仅用于在main函数中完成的数据库更改,而不用于子函数.
主要功能代码:
try {
DB::beginTransaction();
$data = array(
'id' => Input::get('id'),
'task_title' => Input::get('task_title'),
);
DB::table('task')->insert($data);
$id = DB::getPdo()->lastInsertId();
// Add Actionees
if (!$this->addActionees(Input::get('actionees'), $id)) {
DB::rollback();
return Response::json(false);
}
DB::commit();
return Response::json(true);
} catch (Exception $ex) {
DB::rollback();
return Response::json($ex);
}
Run Code Online (Sandbox Code Playgroud)
子功能代码:
private function addActionees($actionees, $id, $status) {
try {
DB::table('task_assignee_user')->where('task_id', $id)->delete();
foreach ($actionees as $act) {
$actAdd = array(
'task_id' => $id,
'user_id' => $act->user_id,
);
DB::table('task_assignee')->insert($actAdd);
}
return True;
} catch (Exception $ex) {
return FALSE;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在上面的示例中,addActionees()不会回滚在函数下执行的更改,在函数中,在addActionees()插入新记录之前,将删除所有针对ID的记录.如果发现异常,那么我想恢复这些更改.
如果您将整个事务包装在一个闭包中 -它将为您处理所有事情:
public mainFunction()
{
try {
DB::transaction(function() {
$id = DB::table('task')->insertGetId(['id' => Input::get('id'),
'task_title' => Input::get('task_title')]);
DB::table('task_assignee_user')->where('task_id', $id)->delete();
foreach(Input::get('actionees') as $act) {
DB::table('task_assignee')->insert(['task_id' => $id,
'user_id' => $act->user_id]);
}
});
} catch (\Exception $e) {
return Response::json($e);
}
return Response::json(true);
}
Run Code Online (Sandbox Code Playgroud)
ps我还重构了你的代码,因为它让我发疯。这应该可行,但我还没有测试过 - 但你明白了总体思路。