我已经多次遇到过这个问题,我真的很想知道为什么会发生这种情况。
这是它的最新出现:
public function updateBirthDate(Request $request)
{
try {
$request->validate([
'email' => 'required|email',
'birthDate' => 'required|date_format:Y-m-d',
]);
$user = User::where('email', $request->email)->first();
$user->profile()->update(['birth_date' => Carbon::parse($request->birthDate)->timestamp]);
return response_success([], __FUNCTION__, __('verification.user_data_updated'));
} catch (Exception $exception) {
Log::error(__FUNCTION__, compact('exception'));
return response_error(__FUNCTION__, $exception->getMessage());
}
}
当我通过 Postman 发送请求时,上面的代码没有更改数据库中的“birth_date”。
但是当我在修补程序中运行下面的行时,它更改了数据库中的“birth_date”:
$user->profile()->update(['birth_date' => Carbon::parse('1990-01-01')->timestamp]);
我想这是这个 Laravel 版本中的一个错误。
我注意到我的一种更新方法不起作用但另一种方法起作用的原因。
以下方法无效:
$user->update([
'confirmation_code' => random_int(100000, 999999),
'email' => $request->email,
]);
以下工作有效:
$user->update([
'mail_confirmation' => true
]);
我错过了一个基本点。
第二个有效,因为
'mail_confirmation'
字段位于 $fillable
数组中,但第一个无效,因为 'confirmation_code'
不在 $fillable
数组中。
Update 是 Laravel Eloquent ORM 模型的批量赋值方法之一。其他的是填充和创建:https://laravel.com/docs/10.x/eloquent#allowing-mass-assignment
因此,除非设置了
$fillable
数组,否则所有字段都必须位于 $guarded
数组中。