使用事务插入记录

时间:2014-11-11 09:07:05

标签: database laravel laravel-4 eloquent query-builder

我正在尝试使用Eloquent在数据库中插入记录。我有以下代码,其中我创建一个新用户,然后在配置文件表中插入一个新行,以便用户在他/她登录时更新他/她的个人资料。

$user = new User();
$user->fill(Input::all());
$user->save();

$profile = new Profile();
$user->profile()->save($profile);
return Response::json(array('message' => 'Your account has been created.'));

我的代码最大的缺点是 - 它使我的桌子处于半煎状态。例如,如果创建用户的记录但由于某种原因,在创建配置文件记录时存在问题,则用户可以存在尚未为他/她创建配置文件的位置。

有没有办法可以规避这个?我知道当我即将访问用户的配置文件时我可以检查配置文件是否存在(如果尚未创建,则创建它 - 使用默认值)但我想知道是否有任何配置文件除此之外的其他方法。

我相信使用交易是前进的方向,如果是的话 - 你能为我提供一个例子吗? 感谢

2 个答案:

答案 0 :(得分:0)

您可以在此处使用交易:

$user = new User();
$user->fill(Input::all());
try {
    DB::beginTransaction();
    $user->save();
    $profile = new Profile();
    $user->profile()->save($profile);
    DB::commit();
    return Response::json(array('message' => 'Your account has been created.'));
}
catch (QueryException $e) {
    DB::rollBack();
    return Redirect::to('url')->withInput()
            ->with('error', 'Error occurred. Try again or contact administrator');
}

答案 1 :(得分:0)

您可以使用此

$user = new User();
$user->fill(Input::all());

$profile = new Profile();

return DB::transaction(function() use ($user, $profile) {
    $user->save();
    $user->profile()->save($profile);

    return Response::json(array('message' => 'Your account has been created.'));
});