【问题标题】:inserting records using a transaction使用事务插入记录
【发布时间】:2015-01-07 18:44:02
【问题描述】:

我正在尝试使用 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.'));

我的代码的最大缺点是 - 它让我的桌子处于半炸状态。例如,如果创建了用户的记录,但由于某种原因,在创建个人资料记录时出现问题,则用户可能存在于尚未为他/她创建个人资料的情况下。

有什么办法可以规避吗?我知道当我即将访问用户的个人资料时,我可以检查个人资料是否存在(如果尚未创建,则创建它 - 使用默认值),但我想知道除此之外是否还有其他方法这。

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

【问题讨论】:

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


    【解决方案1】:

    你可以用这个

    $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.'));
    });
    

    【讨论】:

      【解决方案2】:

      您可以在这里使用事务:

      $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');
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-05
        • 2011-08-11
        • 2011-05-25
        • 2012-03-01
        • 1970-01-01
        • 2022-09-25
        • 1970-01-01
        相关资源
        最近更新 更多