Laravelでは、デフォルトで空文字をnullに変換してしまいます。
「nullと空文字はどう違うの?」
という方向けに、ふたつの違い、null変換を止める方法、nullを条件にデータベースから値を抽出する方法を紹介します。
Laravelのnullをスッキリ理解して、上手にnullと空文字を使い分けていきましょう♪
null(ヌル)と空文字列の違い
null(ヌル)と空文字列は違います。
データベースにはデータ型のようなものをいれます。
空文字の時はデータ型が定まっていて、中身が空っぽな状態。
nullはデータ型も何もない状態です。
データベース上でも違いが分かります。
data4~data7はNull, data8~data10には空文字が入っています。
もしかしたら
「なんだかややこしいなぁ」
「nullなんていらないんじゃない?」
と思う方もいるかもしれませんが(←わたしは最初思いました^^;)、nullは、とっても大事。
データのタイプを定めるデータ型は、日付用や数字用、短めのテキスト用や長めのテキスト用など、ものすごくいっぱいあります。
「空っぽの値」を定義するときには、データ型のことも気にしなくてはいけません。
「データ型とか気にせず処理したい」という時に、nullは非常に便利なんです。
Laravelは空文字をnullにしてしまう
なおLaravelは、デフォルトで「空文字」を許してくれません。
空っぽのカラムがあると、エラーになります。
入力しないかもしれないカラムがある場合、そのカラムをnullable()(=nullでもOK)に設定する必要があります。
下記のように、マイグレーションファイルでカラムにnullable()を付ければOKです。
【’post_image’カラムをnullableに設定した例】
こうすると、入力された空文字は自動でnull値になり、エラーを回避できます。
Laravelのnullを空文字に一括変更する方法
ただ自動でnull値が入ると、困るときもあります。
勝手に空文字をnullに変換しないようにするには、次のようにミドルウェアの設定を変更します。
- app/Httpの中のKernel.phpを開く
- TrimStringsとConvertEmptyStringsToNullを無効にする
この2つのミドルウェアを無効にすることで、空文字列が勝手にnull値に変換されなくなります。
Laravelの公式マニュアルでも、この方法が書かれています。
この動作(空の文字列をnullに変換する)を無効にしたい場合は、アプリケーションのミドルウェアスタックから2ミドルウェアを削除するため、
App\Http\Kernel
クラスの$middleware
プロパティから2つのミドルウェアを削除してください。
*引用元:https://readouble.com/laravel/8.x/ja/requests.html
ただミドルウェアを入れるとなると、他の既存部分にも、色々と影響が出てしまうかもしれません。
「この処理を行う時だけ、Nullを空文字に変換したい」という場合には、array_map関数などを使うと便利。
処理例は、別の記事でご紹介しています。
Laravelでnullや空文字を抽出する方法
最後に、nullや空文字に関連するメソッドを紹介します。
「値がnullや空文字かどうかを条件にしたい」ときに便利なメソッドはこちら。
【null・空文字を条件にするメソッド】
メソッド | 例 | 意味 |
count | if (count($records) > 0) | 1個以上あれば |
isEmpty | if ($records->isEmpty()) | null/空文字/falseなら |
isset | if (isset($records)) | 定義されていてnullでないなら |
null | if($records==null) | nullなら |
「nullかどうかを抽出条件にしたい」場合には、whereNull whereNotNullがあります。
【nullかどうかを抽出条件にするメソッド】
メソッド | 例 | 意味 |
whereNull | $records::whereNull(‘カラム名’) | あるカラムがNullの$recordsデータを抽出 |
whereNotNull | $records::whereNotNull(‘カラム名’) | あるカラムがNullでない$recordsデータを抽出 |
whereNullやwhereNotNullは、色々と使えます。
nullを理解して、引き続きLaravelライフを便利にしていきましょう♪