Laravel : Eloquent について整理

  • ORM

    • PHPオブジェクト指向で、DB(RDB)はSQL文なので、互換性がない。=> 自動的に互換性があるように変換してくれるのがORM。
    • DBのレコードを、オブジェクトとして直感的に扱えるようにするもの
      • DB側の都合をアプリケーションで意識しないで済むようにするもの
    • インピーダンス・ミスマッチ(=)を埋めるもの
      • アプリケーションの要件にそった概念モデル(Entity)は、論理モデル(テーブル)と1対1になるとは限らない
    • インピーダンス・ミスマッチ
      • 概念モデル(Entity)と論理モデル(Table)の設計思想の違いの事
        • オブジェクト指向 : 現実世界の物事に即したデータモデル
        • DB(RDB) : 検索やCRUDなどの処理に最適化されたデータモデル
  • Eloquent

    • Active Record タイプの ORM
    • Active Record
      • 以下のようなデザインパターン
        • データベーステーブルあるいはビューの1行が1つのクラスにラップされ、オブジェクトのインスタンスがそのデータベースの1つの行に結合
        • テーブルとクラスが一対一で結びつくことから非常にシンプルな構造となることが特徴
  • Eloquent Model (Illuminate\Database\Eloquent\Model)

    • 対応するデータベーステーブルへのクエリビルダ
  • Eloquent結果(=Model の get() 等の結果)として、Collection が返る

    • 複数の結果を取得する get() のような Eloquentメソッド は、Illuminate\Database\Eloquent\Collection インスタンスを返す
  • Collection (\Illuminate\Support\Collection)

    • Eloquent 結果 を操作する多くの便利なクラスを提供

Eloquent Model の find() vs get()

  • get()

    • 複数レコードを取得
    • Collection を返す
  • find()

    • 1レコードだけを取得
    • Collection の代わりに、Eloquent Model を返す

追記

Eloquent Model

https://dev-dub.hatenablog.com/entry/2020/06/19/155856

  • get() など、Illuminate\Database\Eloquent\Model に定義されているメソッドが呼ばれた場合

  • find() など、Illuminate\Database\Eloquent\Model に定義されていないメソッドが呼ばれた場合

    • Eloquentビルダー(\Illuminate\Database\Eloquent\Builder) の find() メソッドを呼び出す
      • Model を返す
  • orderBy() など Eloqunetビルダークラス にも定義されていないメソッドが呼ばれた場合

    • Queryビルダー(\Illuminate\Database\Query\Builder) の orderBy() メソッドを呼び出す

Eloquentビルダー (\Illuminate\Database\Eloquent\Builder) の生成方法

  • Eloquent Model の newQuery() メソッドで生成
    • $UserEloquent->newQuery()

Queryビルダー (\Illuminate\Database\Query\Builder`) の生成方法

Eloquent(ORM) vs Queryビルダー(DB ファサード)

  • Laravel で DBからデータを取得する方法は 2つある

  • Eloquent

    • リレーションを使える
    • 実際に実行されるクエリがわかりにくい
  • Query ビルダー

    • Eloquent と比べて高速
    • 実際に実行されるクエリがわかりわすい
    • JOIN 出来る (複雑なクエリが書ける)