【Laravel】空文字がnull値になる理由!ConvertEmptyStringsToNullとは?

【Laravel】空文字がnull値になる理由!ConvertEmptyStringsToNullとは?

この記事からわかること

  • Laravelデータベース格納時のエラー
  • 空文字null値になる原因
  • 自動実行されるミドルウェア解除方法
  • ConvertEmptyStringsToNullTrimStrings意味

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Laravelでフォーム機能を使ってリクエストを送信しデータベースに値を格納する際、空文字("")が勝手にnull値変換されエラーが発生してしまいました。

その原因と解決方法をまとめていきたいと思います。

リクエスト送信の空文字がnull値になる原因

原因:空文字をnull値に変換するミドルウェアが自動実行されていたから

Laravelではバージョン5.4から「空文字が自動でnull値に変換してくれる」ConvertEmptyStringsToNullというミドルウェアがONになっています。

なのでフォーム要素から値を送信する時に空文字(未入力)だとリクエスト情報のinputの値にはnullとして格納されます。

TestController.php

public function form(Request $request){

  // is_null関数=値がnullならtrueを返す
  if(is_null($request->input('name'))){
      // 未入力の場合こちらが実行される
      dd($request->input('name')); // 結果:null
  }else{
      // 入力値があればこちらが実行される
      dd($request->input('name')); // 結果:入力値
  }
}

Laravelでは空文字をnullに変換するConvertEmptyStringsToNullだけでなく文字の空白をトリミングしてくれるTrimStringsというミドルウェアがグローバルミドルウェアとしてデフォルトで登録されています。

(グローバル)ミドルウェアとはリクエストが送られたタイミングで処理を自動実行してくれる機能のことです。今回はフォームに入力後POST(HTTPリクエスト)送信されたタイミングでコントローラに渡される前に入力値に対して変換処理が実行されていたようです。

解決法(グローバルミドルウェアの解除方法)

解決法1:グローバルミドルウェアを解除する

解決法2:データベースのカラムをnullableにする

自動実行されてしまうミドルウェアを登録しているのは「app」>「Http」>「Kernel.php」で管理されています。

「app」>「Http」>「Kernel.php」

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    protected $middleware = [
        〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

「Kernel.php」の中の$middleware配列の中にTrimStringsConvertEmptyStringsToNullが定義されています。

解除するのは簡単でミドルウェアをコメントアウトすれば自動実行されなくなります。これで空文字を送信してもnullへ変更されず空文字としてデータベースに登録することができます。

データベースのカラムをnullableにする

またミドルウェアをコメントアウトして解除しなくてもデータベースのカラム設定をnullable(null値を許可)にすればエラーは発生しなくなります。

マイグレーションファイルの場合はnullableメソッドを実行すればOKです。

日付_create_テーブル名_table.php

public function up()
{
    Schema::create('customer', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name',15);

        $table->integer('age')->nullable();
        $table->timestamps();
    });
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index