Laravelを使いだして、はや数ヶ月たらず。
青本を勉強して、MVCモデルにのっとり、モデルでテーブルを定義して、コントローラーでモデルを呼び出し、そのテーブル情報をビューに受け渡しつつ呼び出している。
まさに教則本通り。
値を取り出すときは、ビューで
@foreach($TABLE as $data)
<tr>
<td>{{$data->COLUMN}}</td>
</tr>
@endforeach
こんな形でBladeに埋め込んでいる。
それはいいのだけど、このテーブル情報って1件だけ取り出した場合ってどうするの?って思った。
ちなみにテーブルの取り出し方はDBクラスとクエリビルダとEloquentの3つ方法があると青本に書いてあったけど、私はややこしいSQL文ばっかり書いているので、クエリビルダやEloquentはあまり使っていない。
なので、first()とかほとんど使ったことがないのだ。
例えばこんなテーブルがあったとする。テーブル名はUDON。
| 商品(NAME) | 金額(PRICE) |
|---|---|
| 天ぷらうどん | 430 |
| きつねうどん | 460 |
| うどん定食 | 550 |
| から揚げ定食 | 550 |
| カレーうどん | 450 |
例えば、一番上の「天ぷらうどん」だけをwhereで指定した場合。
$TABLE = DB::select("SELECT * FROM HOGELIB.UDON WHERE PRICE = 430");
このUDONテーブルで、WHERE文で指定している以上、どうあがいても1行しか引っ張らない。
なので、foreachなんか使わずに連想配列っぽく
{{$TABLE['PRICE']}}
で取り出せるかと思ってやってみたら、PRICEって何ぞ?(Undefined)のエラー
あれ?こうだったか?と思ってやってみたら
{{$TABLE->PRICE}}
Trying to get property ‘PRICE’ of non-objectとエラーが。
あれ・・。どうやって取り出すのよ。
まさか、冒頭に書いたように、こんな風に取り出すの?と思ってやってみたら、
@foreach($TABLE as $data)
{{$data->PRICE}}
@endforeach
でた。天ぷらうどん430円、まいどありがとうございます。でもこんなのでいいのかい?

物は試しにこうやってみた。どうせ1行しかないので、$dataに入れれば後からでも取り出せるでしょ。
@foreach($TABLE as $data)
@endforeach
{{$data->PRICE}}
これも動く。
なんだよこれ。ネットで調べてみたところ、
1件に確定できる条件をつけたのであれば、最初から1件だけを取得してください。
だそうです。
やり方は、
Book::where('id', 123)->first()
やっぱりこんな感じでfirst()で絞るそうだ。ふんふん。
早速やってみた。
$TABLE = UDON::where('PRICE',430)->first();
これはモデルを使ったEloquentです。
すると@foreachなんかつけなくても、
{{$TABLE->PRICE}}
{{$TABLE['PRICE']}}
2つとも出た!なんだこりゃ。上はオブジェクトとして、下は連想配列として取得しようとしているのに、なんでどっちも取り出せるんだ?Eloquent不思議だなぁ。

PHPの基礎がおぼつかない私にとって謎だらけ。気になるので、print_r($TABLE)で中を見てみる。
Eloquentはこんな感じ。1行だけなのにめちゃ多い。しかもめっちゃ謎!
$TABLE = UDON::where('PRICE',430)->first();

次にDBクラスのSQL使用の場合をやってみた。こんどはたったこれだけ。シンプルそうに見えてダメなんだよな。なんだこれ。
$TABLE = DB::select("SELECT * FROM HOGELIB.UDON WHERE PRICE = 430");
![]()
念のためクエリビルダを使ってみた。スッキリ爽快。さらにシンプルになった。
$TABLE = DB::table('HOGELIB.UDON')->where('PRICE',430)->first();
![]()
試しにこのクエリビルダのやつを、Viewで表示してみたら。これは出た。
{{$TABLE->PRICE}}

でも、連想配列で取り出そうとしたら怒られてしまった。
{{$TABLE['PRICE']}}
まとめたらこうなりました。
| 取り出し方 | DBクラス(SQL) | クエリビルダ | Eloquent |
|---|---|---|---|
| {{$TABLE[‘PRICE’]}} | × | × | 〇 |
| {{$TABLE->PRICE}} | × | 〇 | 〇 |
私の場合は、ややこしいSQL文を書くことが多いので、DBクラスばかり使っているのだが、こまったなぁ・・・。
DBクラスもこんな感じで最後に->first();とか書けたらいいのだが。関係ないか。そもそも構造が違うんだから。
$TABLE = DB::select("SELECT * FROM HOGELIB.UDON WHERE PRICE = 430")->first();
これはさっき表示したDBクラスで得た中身なんだけど、よく見るとArrayに入ってますよね。Arrayの0。そこからObjectになってる。
![]()
ということは、
{{$TABLE[0]->PRICE}}
これでいけんじゃね?と思ってやってみたら、
見事成功。

なんか力技のような気がするんだけど、これしか方法がないよね。
他にやり方があったら教えてほしいです。

コメント