menu

【Laravel】Eloquentを理解する

公開日:2021年05月27日 カテゴリー:Laravel, PHP, 開発

Laravelには便利なEloquentモデルというものがあります。しかし、first()やget()など取得する方法によって、型が変わってしまいます。
また、動的プロパティによりリレーションを張っているものには楽に取得できる反面、遅延ロードのためSQLクエリが毎回発行されてしまう、なんてこともあります。

そこで今回はEloquentモデルを簡単にご説明いたします。

Eloquentモデルとは

Eloquentモデルとはそもそもなんでしょうか。これは Illuminate\Database\Eloquent\Model を拡張して作られたMVCのM、つまりモデルです。

このモデルを定義することで、DBの情報を簡単にやり取りできるようになります。

データ取得の方法

Eloquentモデルの取得の方法は簡単に4つに分けられます。つまり、 find(), get(), all(), first()です。
それぞれの取得する型の比較表は以下の通りです。

find() Modelオブジェクト
get() Collectionクラス( Illuminate\Database\Eloquent\Collection )で、個々の中身はModelオブジェクト
all() Collectionクラス( Illuminate\Database\Eloquent\Collection )で、個々の中身はModelオブジェクト
first() Modelオブジェクト

このような形になっています。

この時、Collectionクラスは複数のモデルにより構成されていると考えるといいでしょう。それゆえCollectionクラスは foreach を回すことで、Modelを取得できるようになります。

考察:クエリビルダとの比較

Eloquentモデルと並んでDB操作でよく使われる方法にクエリビルダがあります。これはどう違うのでしょうか。
それぞれ取得する型の比較表は以下の通りです。

get() Collectionクラス( Illuminate\Support\Collection )で、個々の中身はStdClassオブジェクト
first() StdClassオブジェクト

似ているようで微妙に異なりますね。Modelを作っていないのでStdClassオブジェクトが返される、と私は解釈しています。
しかし明らかなのはModelではないので、Eloquentモデルで定義したメソッドは使うことができません。

遅延ロードとEagerロード

さて、Eloquentモデルを簡単に理解していただいたと思いますが、次は動的プロパティの時の挙動を考えてみましょう。

LaravelのEloquentにはリレーションを定義できます。それぞれのModelにリレーションを定義することで、動的プロパティによりリレーション先のプロパティも取得できます。
しかし、この動的プロパティは「遅延ロード」という、つまり、そのリレーション先のプロパティが参照されるまでロードされない、という仕様があります。

この遅延ロードのメリットとしては必要最低限のデータだけがロードされるのでリソースにやさしい、が挙げられます
しかし、毎回アクセスするたびにロードされるので、場合によっては大量のSQLクエリを発行してしまい、ボドルネックになる恐れもあります。(いわゆるN+1問題)

そんなとき、役に立つのはEagerロードです。このEagerロードは親テーブルが参照されたとき、一緒にリレーション先の子テーブルも参照するようにSQLクエリを発行することができます。

使い方は簡単です。

たったこのひとつをメソッドチェーンするだけで、hogehogeモデルがEagerロードされます。
もし、複数のリレーションをEagerロードする場合は

のように配列で渡してあげるだけでOKです。

また、ネストしたリレーションをEagerロードする場合は

のように[.]記法で対応できます。

終わりに

Eloquentはとても便利です。ぜひ皆さんもマスターしてください。

最後までお読みいただきありがとうございました。

ウィズテクノロジーで一緒に働きませんか?
分野を限定せず幅広い事業を展開。新しい技術の導入にも積極的に取り組んでおり、チャレンジや成長する機会が沢山。
あなたの経験・知識を活かしながら一緒にIT業界を盛り上げて行きましょう!
採用情報詳細はコチラ