ブログ

Blog

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

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 Loadingwithメソッドで実現できます。


$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