如果查询失败或者因为更新值相同而没有影响该行,则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'];
}
答案 0 :(得分:7)
更新查询返回受更新查询影响的行数。
$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
,如果用户详细说明了您尝试将其设置为的位置,则更新。
答案 1 :(得分:0)
您可以使用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'];
}
答案 2 :(得分:0)
如果值相同,更容易更新:
App\User::find($requestdata['user_id'])->update([
'first_name' => $requestdata['user_fname'],
'last_name' => $requestdata['user_lname'],
'updated_at' => Carbon::now()
]);
答案 3 :(得分:0)
在laravel 6.x上使用tap helper为我工作:
return tap(User::findOrFail($id))->update($request->all());