laravelにはEloquentという強力なORMがあります。データベースのテーブルをモデルと対応させ、モデルのインスタンスでレコードを表現するものです。
この記事では、モデルのfindメソッドによるデータベースのデータレコード取得の方法について説明します。
laravel Eloquent の findメソッドの使い方
モデルクラス::find(主キー)
最初は単一のモデルを取得する方法です。findメソッドにデータベースのテーブルの主キーを指定します。デフォルトでは id カラムを意味します。
例えばProjectモデルがあったとすると、以下のように対応するprojectsテーブルでidに主キーマークが付いていますね。
簡易チェックとして、tinkerで取得のテストをしてみます。
$prj = Project::find(1) を実行すると、下図のように、id = 1 のProjectデータが$prjに取得されているのがわかります。
モデルクラス::find(主キーの配列)
複数のレコードを取得することも出来ます。その場合、戻り値はコレクションになります。
$prjs = Project::find([1,2,3]) として3つのレコードを取得してみましょう。
下図のようにid = 1, 2, 3の3つのレコードが取得されてます。
ここで変数 $prjs を見てみると、ちゃんと代入されていることがわかります。
モデルクラス::find(配列)の戻り値はEloquentのコレクション
コレクションは配列に比べてかなり便利なメソッドがついてます。
また、Laravelのコレクションには、ベースコレクションと、ベースコレクションを拡張したEloquentコレクションがあり、findメソッドの戻り値は、Eloquentコレクションになります。
ベースコレクション
配列と違って、色々な操作をすることが出来ます。クエリビルダでは、データベースのテーブルデータに対して、where でフィルタリングかけたり出来ましたが、ベースコレクションでもwhereメソッドがあり、コレクションデータに対して、フィルタをかけることが出来ます。
他にもかなりの操作ができます。詳しくは下のマニュアルを御覧ください。
Eloquentコレクション
そして、Eloquentコレクションは、ベースコレクションを継承して、さらに、データベース用に拡張されています。
例えば、findメソッドはベースコレクションになく、Eloquentコレクションにだけ存在します。使い方はクエリビルダーのfindと同じです。
他にも同じメソッドはあるけど、Eloquent コレクションは、主キーをもとに動作するというものもあります。
例えばuniqueとかのメソッドが該当します。ベースコレクションでは、コレクションの要素自体の重複を削除するのですが、Eloquentコレクションでは、主キーの重複を削除します。
Eloquentコレクションについてもマニュアルがありますので、詳しくは見てみてください。
クエリビルダのfindとEloquentコレクションのfindの使い分け例
クエリビルダで取得するデータを絞っておけば、Eloquentコレクションのfindを使う必要はありません。
でも、クエリビルダでは一気に複数のデータレコードを取得しておき、Eloquentコレクションにたいしてデータ取得することにより、クエリ発行数を減らし高速化を図ることが出来ます。
なので、例えば、id = 1, 2, 3,4 に対して処理をしなければならないとき、まず、
1 |
$prjs = Project::find([1,2,3,4]); |
として、$prjs変数に、Eloquentコレクションとしてデータを取得しておき、使うたびに、
1 2 3 |
$prj_done = $prjs->find(1); $prj_other = $prjs->find(2); ・・・・ |
などと、Eloquentコレクションのfindメソッドを使って参照すれば、SQLクエリを1回発行するだけで処理でき、高速化が見込めます。
下図は、先程の例で、Eloquentコレクションのfindメソッドを使って見た例です。
クエリの回数は、大規模にデータを呼び出し、何度も並べ替えたり、条件ごとに何度も検索したりするウェブページを作るときは特に速度に違いがでます。
毎回クエリビルダでSQLアクセスするのか、一旦Eloquentコレクションとして一気に読み出して、そのあと、Eloquentコレクションのメソッドを使って、データを利用していくのかを検討する価値はあります。
高速化のためには、何度もSQLクエリを発行するのはなるべく避けたいところですし、だからといって最初に変数へ読み出すとメモリを多く消費してしまうので、速度とメモリサイズでトレードオフが必要でしょう。
まとめ
この記事では、Eloquent のクエリビルダのfind について説明しました。
findには、単一のデータレコードを取得する方法と、配列を引数に渡して複数のデータレコードを取得する方法があります。
クエリビルダで複数レコードを取得する際には、Eloquent コレクションとしてデータを取得します。
そしてEloquentコレクションには、findメソッドを始めとして、クエリビルダに匹敵するほどのメソッドがあります。
ウェブアプリのパフォーマンスを上げるため、Eloquentコレクションもうまく使っていけるようになりましょう。
Laravelの使い方を基本から学びたい場合には、下記の本がおすすめ。
僕も、本のチェックで参加しました。発売は2023年3月22日の予定です。
コメント