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' を null にすることはできません

しかし、それはnullであってはなりません。空の文字列にしたいのです。これに対処する標準的な方法は何ですか?

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 に答える