laravel find と where と カラム と pluck が使えたり使えなかったりする理由
laravelを使っていて、
クエリビルダ―よりエロクアントが使いやすい
という記事を読み、自分もどうにか使い込んでいる。
しかし、思ったようにいかないことが多々ある、というか多すぎる!!。
これはエロクアントのインスタンスが、
①モデルインスタンスなのか、
②コレクションなのか、
この違いによってメソッドまでも違う働きをしてしまうようなのだ。
今のところ、自分が試した結果、findとwhereでの違いを以下のように確認した。
1⃣findの場合
$モデルインスタンス = モデル::find(id);
findでID絞り込み検索した場合はモデルインスタンスとなって一塊のイメージでインスタンスする。
モデルを使ってカラムを引き出す場合、直接
$モデルインスタンス -> カラム;
で取り出せる。しかしモデルインスタンスをpluckした場合、こうはいかない。
$モデルインスタンス ->pluck('カラム’);
では指定したid以外の全てのカラムまで取ってしまうのだ。
結局IDで絞り込んだ意味がない!!。
2⃣whereの場合
$コレクション = モデル::where('カラム’、’検索文字’);
whereで絞り込み検索した場合はコレクションとなり、バラバラのイメージでインスタンスする。
そしてコレクションは直接カラムでは取り出せない。(と思う、違ったらごめん)
$コレクション -> カラム;
駄目!この場合は何故かエラーになる(と思う、違ったらごめん)。
ずっと何でなん?取り出せるときと取り出せない時があるんだよと不思議に思っていた。コレクションでは直でカラムは取れないっぽいのだ
これはおそらくwhereは
「複数のレコードをとる」
という前提があるからなんだと思う。複数のレコードの中のどのカラム?という混乱がパソコンの中に渦巻くのであろう。
というわけで、where検索した場合は
「pluck」
でカラムを取り出さないといけないのだ。
$コレクション -> pluck('カラム’);
これだとwhereで選択したレコードの全カラムがコレクション配列として取り出せる。
(注)ただ、コレクション配列に大注意がある!!!
コレクション配列は、ほぼ配列のように扱えるが、
empty とか inArray
にかけようとするとエラーになったりする!!!!!。
この場合はちゃんと
->all() とか
->first()
->get()
で「コレクション解除」しないといけない。このあたりもエロクアントの使いずらいところだ。
結論
find 直カラム〇 pluck△(全取り)
where 直カラム× pluck〇
「ID検索はfindだ!」と決めつけてpluckでカラムを絞り込もうとすると、前途のように全カラムを取り出して結局IDで絞り込みした意味がなくなる。
というかIDはプライマリーキーだから一個しか検索しないので直接カラムで取ればいいってことなんだろうな。
しかし、pluckにはキーをつけることもできて便利。
どうしてもpluckを使いたいときはwhereでもID検索ができるのでそうしよう。
(余談)
しかし、データーベースの更新SAVEをするときはWHEREのID検索では出来なくて、ちゃんとFINDでID検索しないとSAVEできなかったりするのでほんとややこしい!!。
モデルインスタンスとコレクションの違いでできたりできなかったりすることがほんとに多々ありすぎるのだ!!。