Laravel:ControllerからViewに渡した配列が空か調べる方法
ControllerからViewに渡した配列が空か調べる
よく考えれば当然だったのですが、思いのほかハマったので備忘録を記載します。
やりたいことはContorollerにてWhere句で抽出したものに値があるかどうかの確認。
例えば、商品登録は出来ていてもサイズの記載がない時、抽出結果で分岐させる処理に使います。
まずはおさらい Nullと0(ゼロ)と””について
- Null:値がない
- 未定義:レコードが存在しない
- 0:0という値が存在している
- ””:空白(値の記入がない)という値が存在している
今回取得したいのは『抽出されたか否か』であるため、【0】【””】は値があると判断させたいです。
つまり、抽出結果がNullであるか否かの確認です。
コントローラーのスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public function edit($id) { $saleitem = Saleitem::find($id); $saleitemsizes = Saleitemsize::where('saleitem_id',$id)->get(); return view('saleitems.edit', compact ( 'saleitem', 'saleitemsizes' ) ); } |
商品情報:saleitemsテーブルからGETで$idを受取り、その$idを利用してsaleitemsizesテーブルから値を取得、ビュー:saleitems.edit へデータを渡しています。
ビュー:edit のスクリプト
まずは解答から
1 2 3 4 5 6 7 8 9 10 |
/* if文でNull分岐 */ @if(!isset($saleitemsizes[0])) ※値がありません。 @else ※値が存在します。 @foreach($saleitemsizes as $saleitemsize) {{@saleitemsize}} @endforeach @endif |
下は何度やってもうまくいかなかった間違いの例です。
1 2 3 4 5 6 7 8 9 10 |
/* if文でNull分岐 */ @if(!isset($saleitemsizes)) ※値がありません。 @else ※値が存在します。 @foreach($saleitemsizes as $saleitemsize) {{@saleitemsize}} @endforeach @endif |
間違いは『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を!で否定しているため【存在が確認できない場合】の条件となる
まとめ
はい、よく考えれば当たり前の事でした。
-
前の記事
マルコフ連鎖用テーブルの構造 2019.01.09
-
次の記事
phpMyAdmin:CSVインポートでNULLを入れる方法 2019.01.10
コメントを残す