【问题标题】:Laravel DB::update only return 0 or 1Laravel DB::update 只返回 0 或 1
【发布时间】:2016-11-27 19:55:33
【问题描述】:

Laravel DB update 函数返回 0 如果查询失败或行不受影响,因为更新值相同。

如何检查查询失败是因为错误还是因为行没有受到影响?在下面的代码中,如果值相同,它将返回并且不会在控制器中运行下一组代码。

 $query = DB::table('users')
   ->where('id',  '=' , $requestdata['user_id'] )
   ->update([
       'first_name' => $requestdata['user_fname'], 
       'last_name' => $requestdata['user_lname'], 
    ]);

    if ( !$query ) { 
        return ['error' => 'error update user']; 
    }

【问题讨论】:

  • 你应该使用try catchDB transaction来做这种事情,而不是使用if else

标签: database laravel


【解决方案1】:

在 laravel 6.x 中使用 tap helper 为我工作:

return tap(User::findOrFail($id))->update($request->all());

【讨论】:

  • 在您的班级中导入 Illuminate\Support\Traits\Tappable 以开始使用 tap,如答案所示。
【解决方案2】:

如果相同的值,更新的简单方法:

App\User::find($requestdata['user_id'])->update([ 
      'first_name' => $requestdata['user_fname'],  
      'last_name' => $requestdata['user_lname'],
      'updated_at' => Carbon::now()
]);

【讨论】:

    【解决方案3】:

    你可以使用try catch:

    try { 
      $query = DB::table('users')
        ->where('id',  '=' , $requestdata['user_id'] )
        ->update([
          'first_name' => $requestdata['user_fname'], 
          'last_name' => $requestdata['user_lname'], 
        ]);
    } catch(\Illuminate\Database\QueryException $ex){ 
        return ['error' => 'error update user']; 
    }
    

    【讨论】:

      【解决方案4】:

      更新查询返回受更新查询影响的行数。

      $returnValue = DB::table('users')
      ->where('id', '=', $data['user_id'] )
      ->update([
          'first_name' => $data['user_fname'], 
          'last_name' => $data['user_lname'], 
      ]);
      

      所以上面将返回更新的记录数。 0 表示没有更新记录。

      但是,对您来说,即使返回了 0,它也可能并不表示错误,因为它只是意味着没有更新的记录。因此,如果您尝试使用实际已经包含的详细信息更新用户的姓名和姓氏,查询将返回 0

      有用的旁注,玩php artisan tinker,即。

      >>> $retval = DB::table('users')->where('id', 1)->update(['first_name' => 'Testing']);
      => 1
      

      再次运行相同的查询,您会注意到它返回 0 受影响的行,因为名称已经是 Testing

      >>> $retval = DB::table('users')->where('id', 1)->update(['first_name' => 'Testing']);
      => 0
      

      更新补充

      所以对你来说,最好先检查用户是否存在User::findOrFail($id),或者只检查User::find($id)的返回,然后如果用户存在,你对返回的$user进行条件更新。更明确的是,更新为不存在的用户返回相同的0,并且如果用户已经详细说明了您尝试将其设置为的位置。

      【讨论】:

      • 是的,我认为最好先检查用户是否存在,错误使用 try catch 块
      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      相关资源
      最近更新 更多