Laravel:ControllerからViewに渡した配列が空か調べる方法

Laravel:ControllerからViewに渡した配列が空か調べる方法

ControllerからViewに渡した配列が空か調べる

よく考えれば当然だったのですが、思いのほかハマったので備忘録を記載します。

やりたいことはContorollerにてWhere句で抽出したものに値があるかどうかの確認。

例えば、商品登録は出来ていてもサイズの記載がない時、抽出結果で分岐させる処理に使います。

まずはおさらい Nullと0(ゼロ)と””について

  1. Null:値がない
  2. 未定義:レコードが存在しない
  3. 0:0という値が存在している
  4. ””:空白(値の記入がない)という値が存在している

今回取得したいのは『抽出されたか否か』であるため、【0】【””】は値があると判断させたいです。
つまり、抽出結果がNullであるか否かの確認です。

コントローラーのスクリプト

商品情報:saleitemsテーブルからGETで$idを受取り、その$idを利用してsaleitemsizesテーブルから値を取得、ビュー:saleitems.edit へデータを渡しています。

ビュー:edit のスクリプト

まずは解答から

下は何度やってもうまくいかなかった間違いの例です。

間違いは『Controllerから渡された配列 $saleitemsizes そのもので存在確認をしている』事です。

じゃあ、配列に値が無いんだから($saleitemsizes ==””)でいいんじゃね?とも思いましたがこれもNG。

よく考えればベタ打ちしてた時、forechで最初のレコード取得して有無確認してたなと思い、$saleitemsizes[0]としたら想定していた動作となりました。

Nullの分岐は指示の仕方で値が変わります

今回はレコードの指示の仕方が問題でしたが、ベタ打ちのころから悩むのが条件により答えが変わる事。

ゼロ、null、”” をどうとるかまとめます。

関数 / 項目 $a = 未定義 $a = NULL $a = ”” $a = 0
$a == Null true true true true
$a == “” true true true true
$a == 0 true true true true
$a === Null true true false false
$a === “” false false true false
$a === 0 false false false true
is_null($a) true true false false
isset($a) false false true true
empty($a) true true true true

関数を曖昧にする( == で結ぶ)場合は 【0== “” == Null == 未定義 ==”0″】全てでTRUEを返します。

値の判別を厳格にした時(===で結ぶ)場合、【Null == 未定義】以外はすべて別のものとして認識されます。その為、$a=Null であっても @if($a===””)と指示した場合FALSEが返ってきます。

今回の【商品サイズ】の例では、カラムに空白や0が入っていた場合は抽出をしたいので、分岐の指示は以下3つのどれかになります。

  • @if($a === Null)
  • @if(is_null($a))
  • @if(!isset($a)) ※issetを!で否定しているため【存在が確認できない場合】の条件となる

まとめ

レコードの存在確認は最初のレコードを指定する。

はい、よく考えれば当たり前の事でした。