Eloquent 模型更新方法不通过 Web 工作,但在 Laravel 10.45.1 中通过 Tinker 工作

问题描述 投票:0回答:1

我已经多次遇到过这个问题,我真的很想知道为什么会发生这种情况。

这是它的最新出现:

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 版本中的一个错误。

laravel eloquent crud laravel-10
1个回答
0
投票

我注意到我的一种更新方法不起作用但另一种方法起作用的原因。

以下方法无效:

$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
数组中。

© www.soinside.com 2019 - 2024. All rights reserved.