「Laravelのコレクションは配列のラッパーだ」
と説明されますが、正直、この説明は分かりにくい!
40代でプログラミングを学び始めたわたしには、ラッパーという単語からして意味不明でした。
そこでプログラミング初心者でもわかるよう、とことこん分かりやすく解説してみました。
楽しんで読んでもらえたら嬉しいです。
LaravelのCollectionをストーリーで解説
① Webアプリでは、データベースとの連携が非常に重要です。
データベースからデータを取り出したりするために、Mr.SQL文が仕事を取り仕切っていました。
ですが難しい仕事をする彼からは、親しみにくいオーラがただよっていました…
② 当然、お客さんであるプログラマーユーザーたちは、そんなMr.SQLを扱いにくいと感じていました。
③そこで、データベースからもっと分かりやすくデータを取り出すために、新人のクエリビルダくんが登場しました。
クエリビルダくんはコミュニケーションがしやすくて、ユーザーからの評判は上々です。
④ Laravelの作者、Taylor氏も、こんなクエリビルダくんを気に入り、Laravelの中に取り込みました。
⑤ ただ、もっと分かりやすくデータベースと連携できるシステムがほしいと思いました。
そこでTaylor氏は、既存の仕組みを応用して、Eloquent(エロクエント)というシステムを開発しました。
Laravelがモデルを通じて、データベースと上手に連携できるためのシステムです。
【Eloquent】
⑥ Eloquentを使えば、モデルを通じて、データベースからデータをサクッと取得できます。
さらに取得してきたデータも分かりやすく処理したいのですが、ここで問題がおきます。
データ処理係の配列さんの仕事ぶりが、いまいちなのです。
良い仕事をしてくれるものの、コミュニケーションスキルが低い。
配列さんを使い続けたいTaylor氏は、悩みました。
⑦ そこで思いついたのが、配列さんをサポートする係を作ること。
こうして Ms.コレクション が誕生したのです。
Ms.コレクションはデータベースから取得してきたデータをコレクション型に変換し、お客さんに分かりやすく示してくれます。
Ms.コレクションの高いコミュニケーション力のおかげで、配列さんの苦手な部分がカバーされました。
⑧ お客さんであるプログラマーさんは、Ms.コレクションとの仕事に大満足。
配列さんが裏で引き続き仕事を行っているのですが、みんなMs.コレクションが仕事をしていると思っています。
まあ配列さんも表に立ちたくないし、みんな満足しているので良しとしましょう。
めでたし、めでたし。
ご留意事項
◆この物語は、分かりやすく機能を説明するために本ブログ管理人が作成したフィクションです。Laravelの作者であるTaylorさんに許可はとっておりません。
◆Taylor氏は既存のパターンを応用して、Eloquentを作成したようです。ただ公式なページにハッキリした記述を見つけられませんでした。下記のQ&Aを参考にしております。
Stack Overflow:「だれがLaravelのためにEloquent ORM を発明したか?(英語)」
Collectionストーリーを補足説明
ということで、なんとなく、イメージを掴んでいただけたでしょうか?
ここからは、文章で補足説明していきますね。
Laravelのようなサーバーサイドでは、データベースと上手に連携する必要があります。
データを処理するときには配列を使うのですが、これだとイマイチ分かりにくい。
そこで、Laravelでは、コレクションというものを準備してくれています。
コレクションを使うと、データ処理用のコードを非常にシンプルに記述できます。
なお、コレクションのように、本来の機能(配列さん)を使いやすくしてくれる存在をラッパーと呼びます。
英語で書くとWrapper。動詞系はラップ(Wrap)。
包むという意味で、ラッピングとかサランラップのラップと同意です。
なぜラッパーかといえば、コレクションは配列の存在をベールで包んで、ユーザー側からは見えなくしているため、と考えるとわかりやすいですね。
ちなみに、ラッパーというと歌う人のイメージがありますが、このラッパーはRapper。
スペルも違う、別の単語です。
コレクションをつかったメソッド一覧と利用例
コレクションを使ったメソッドは、実際にどんなものがあるか少し紹介します。
Laravel8では、これだけのメソッドがあります。
*参考:Laravel8 マニュアル 「コレクション」
すごい量!
クエリビルダと同じ名前、用途のメソッドがあったりします。
クエリビルダのメソッドを参考にして、コレクションのメソッドが作られたからだと推測されます。
実際にどのように使うか、例をお見せします。
クエリビルダのwhereメソッドを使って、下記のコードで役割が3のユーザ一覧を取得するとします。
いったんデータベースから取得したあと、さらにユーザーを絞り込みたいとします。
そういった時、たとえば次のようにコレクション型のメソッドwhereを使って、idが2のユーザーを絞り込めます。
コレクション型だからこそ、こんなふうに手軽に操作ができます。
$users が配列だったら、$users->where は使えません。
さいごに
Laravelの仕組みやコレクションについて、少しでも「前よりわかったかも」と感じて頂けたら嬉しいです。
Webアプリにとって、データベースとの連携やデータの処理は重要なポイント。
Laravelは、この部分を柔軟かつ効率的に処理ができるフレームワークです。
Laravelの使い方は、他の記事で説明しているので、あわせて参考にしてくださいね。