結論
自動で空文字がnullに変換される
Laravelのミドルウェア[TrimStrings]と[ConvertEmptyStringsToNull]により、空の文字列フィールドは自動でnullに変換される。この処理を無効にするには、App\Http\Kernelクラスの$middlewareプロパティから該当のミドルウェアを削除する
https://readouble.com/laravel/5.4/ja/requests.html
(入力のトリムとノーマライゼーション)
入力値が空かどうかの判別
ユーザーがフォームからリクエストを送信する場合、任意項目は空のまま送信されることがあります。
例えば任意項目(例:質問)の入力有無で処理を分けたい場合に、以下のどちらで判別するか迷っていました。
//空文字が送られてくる場合
if($question !== ''){・・・}
//nullが送られてくる場合
if(isset($question)){・・・}
nullに自動変換するなら2番目か、と思っていましたが、
そもそもempty()
を使えばどちらで良かった。。
//空文字だろうがnullだろうがこれでOK
if(!empty($question){・・・}
コントローラー等でチェックする場合はこれでチェック可能。
入力値が存在するor空文字で無い場合はtrue
を返す。
(ドメインモデルでチェックする場合はRequestクラスに依存するため使わない方が良さそう)
if ($request->has('question')) {・・・}
[追記]コメントで指摘頂きました。
Laravel5.5ではhas
メソッドは空文字の場合もtrueを返す仕様に変わったようです。
5.5ではfilled
メソッドを使うと5.4のhas
メソッドと同じことが実現できるようです。
if ($request->filled('name')) {・・・}