交易不适用于子功能

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的记录.如果发现异常,那么我想恢复这些更改.

Lau*_*nce 0

如果您将整个事务包装在一个闭包中 -它将为您处理所有事情

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我还重构了你的代码,因为它让我发疯。这应该可行,但我还没有测试过 - 但你明白了总体思路。