0

我有一个带有许多可填写字段的模型

class Customer extends Model
{
  protected $fillable = [...,'my_field'...]
}

我还有一个控制器可以使用以下方法更新此表:

public function update(Request $request, Customer $customer)
{
    error_log($request->all());
    $customer->update($request->all());
    return response()->json($customer, 200);
}

如果我发送的请求正文包含空字符串:

{
    ...
    "my_field": "",
    ...
}

该字段将被 $request->all() 方法删除,从而生成如下数组:

Array
(
...
[my_field] =>
...
)

然后创建此错误:

Illuminate\Database\QueryException:SQLSTATE [23000]:完整性约束违规:1048 列“my_field”不能为空

但它不应该为空,我希望它是一个空字符串。处理这个问题的标准方法是什么?

4

1 回答 1

1

Laravel 使用中间件将请求中的空字符串转换为null. 如果你想防止这种情况发生,你应该\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class从.$middlewareApp\Http\Kernel.php

它在ConvertEmptyStringsToNull中间件中转换为以下函数:

/**
 * Transform the given value.
 *
 * @param  string  $key
 * @param  mixed  $value
 * @return mixed
 */
protected function transform($key, $value)
{
    return is_string($value) && $value === '' ? null : $value;
}

注意:您还可以在使用请求值更新之前手动检查并覆盖请求值$customer。考虑添加验证;那么您可以使用该$request->validated()功能而不是该$request->all()功能来防止mass assignment vulnerability.

于 2021-07-15T09:28:10.960 回答