Laravel 8 将整数保存到空数据库列中 - 保存与更新

Laravel 8 save integer into null DB column - save vs update

我有一个有趣的问题,Laravel 的 save() 没有替换数据库中的 null 值,而 update() 可以。我还通过手动将 null 更改为 1 进行了测试,然后 save() 开始更新该列。我在整个项目中都在使用 save(),我希望它保持这种状态,或者至少我在更改代码之前了解问题所在。

迁移(所有代码将是 brewity 的部分摘录):

$table->foreignId('checklist_id')->nullable()->constrained('checklists')->onUpdate('cascade')->onDelete('cascade');
$table->foreignId('action_id')->nullable()->constrained('actions')->onUpdate('cascade')->onDelete('cascade');

模型(添加了checklist_id和action_id用于测试,否则它们不在这里):

// test
protected $fillable = [
    'checklist_id',
    'action_id',
];

protected $casts = [
    'checklist_id' => 'integer',
    'action_id' => 'integer',
];

// actual
protected $fillable = [
];

protected $casts = [
];

控制器:

public function update(UpdateWorkOrderRequest $request, WorkOrder $workOrder)
{
        $response = $workOrder->save($request->all());
}

表单提交(来自Chrome):

------WebKitFormBoundary73Z4wzsmsGcgOOAM
Content-Disposition: form-data; name="checklist_id"

1
------WebKitFormBoundary73Z4wzsmsGcgOOAM
Content-Disposition: form-data; name="action_id"

1

dd($request->all()):

array:2 [▼
  "checklist_id" => "1"
  "action_id" => "1"
]

字段 checklist_idaction_id 在使用 save() 后为 null,但使用 update() 确实会更新它们。如果我这样做,它也会起作用:

$workOrder->checklist_id = $request->checklist_id;
$workOrder->action_id = $request->action_id;
$workOrder->save();

我选择 save() 来编写更少的代码而不是上面的示例,因为从文档中我认为我可以在从 $request 分配数据时使用 save(),如下所示:https://laravel.com/docs/9.x/eloquent#updates

如评论中所述,您正在尝试使用 model->save(attributes)

保存函数不为此提供任何参数。 (docs).


您有两个选择,要么使用 model->update 函数 (docs):

$workOrder->update($request->all());

或将 model->fill (docs) 函数与 model->save 结合使用,如下所示:

$workOrder->fill($request->all())->save();