Eloquent ORMを分かりやすく説明してみる

はじめに
Laravelで採用されているEloquent ORMについて書いていきます。最近Laravelの案件に入りましてEloquentだのクエリビルダだのデータベースとのやり取りをする手段が複数あってどれを選択するべきかと少し混乱しました。自分の脳内を整理すると同時に私と同じようなLaravel入門者のお役に立てればと思います。
※当記事ではLaravelバージョン11を前提として進めていきます。
ORMとは
そもそもORMってなんだっけ? ORMとは「Object-Relational Mapping」の略で、オブジェクト指向プログラミング言語とリレーショナルデータベースの間のやり取りをいい感じに取りまとめてくれる技術のことです。わざわざ生のSQL文を書かなくても容易にデータを取り出せたり、加工できたりするのはこのORMのおかげです。LaravelではEloquent ORMが採用されています。
https://e-words.jp/w/O-R%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0.html
Eloquentとは
Eloquentとは、Laravelで採用されているORMです。特徴は簡単であることです。
itemsテーブルを扱う場合、モデル作成コマンドを実行すると自動でEloquentが利用可能になります。
php artisan make:model Item
コマンド実行だけでModelにuse Illuminate\Database\Eloquent\Model;
が追加され、意識せずともEloquentが使えます。
DBから値を取得する例:
$items = Item::get();
直感的で容易に使えるのが初心者にも分かりやすいメリットです。
Eloquentの特徴
Eloquent Collection
Eloquent ORMではEloquent Collectionというヘルパーが使用できます。Collectionとは配列やDBクエリ結果を扱いやすくするLaravelのオブジェクトで、150種類のヘルパー関数が使えます。
https://readouble.com/laravel/11.x/ja/collections.html#collection-method-list
Eloquent CollectionはCollectionを継承しており、Eloquentモデルから生成されるCollectionではEloquent Collectionのメソッドも使用可能です。
$item = Item::find(1);
$items = Item::get();
$item_collections = collect([1,2,3]);
$item = $item_collections->find(1); // Error: Method Illuminate\Support\Collection::find does not exist.
用途に合わせてCollectionかEloquent Collectionを選んでください。
https://readouble.com/laravel/11.x/ja/eloquent-collections.html
リレーション
Eloquentを用いると容易にリレーションが定義できます。1対1リレーションの例:
class Item extends Model {
public function store() {
return $this->hasOne(Store::class);
}
}
class Store extends Model {
public function item() {
return $this->belongsTo(Item::class);
}
}
リレーションを組むとモデルから関連データを簡単に取得できます。
$item = Item::first();
$store_name = $item->store->name;
echo $store_name; // Aショップ
https://readouble.com/laravel/11.x/ja/eloquent-relationships.html
Eager Loading
N+1問題を解決するEager Loadingはwith
メソッドで実現できます。
$stores = Store::with('items')->get();
発行されるSQL例:
クエリ |
---|
SELECT * FROM stores; |
SELECT * FROM items WHERE store_id IN (…); |
詳細はこちら。
クエリビルダとの違い
クエリビルダは複雑なクエリやパフォーマンス重視時に有効です。
記述方法
// クエリビルダ
DB::table('items')->where('name','pen')->get();
// Eloquent
Item::where('name','pen')->get();
戻り値
データ型 | 利用可能メソッド | |
---|---|---|
クエリビルダ | Collectionオブジェクト | Collectionメソッド |
Eloquent | Eloquent Collectionオブジェクト | Eloquent Collectionメソッド |
クエリビルダのメリット
複雑なサブクエリや性能調整にはクエリビルダが優秀です。
他ORMと比較
Laravel Eloquent | CodeIgniter | Cake PHP | |
---|---|---|---|
リレーション | 〇 | × | 〇 |
Eager Loading | 〇 | × | 自動 |
アクセサ・ミューテタ | 〇 | 〇 | 〇 |
最後に
Eloquent ORMを活用するとコード量が減り可読性が向上します。ここにない機能も多いので、引き続き勉強していきます。
株式会社BTMではエンジニアの採用をしております。ご興味がある方はぜひコチラをご覧ください。
-
SNS
-
投稿日
-
カテゴリー
BTM Useful