Day 4・EloquentとリレーションとN+1問題
Eloquentの基本
モデル1つがテーブル1つに対応する。SQLを直接書かずにデータを読み書きする仕組みを理解する。
EloquentとORMとは
はLaravelに標準搭載された (Object-Relational Mapping)です。ORMとは、DBのテーブル(表)とプログラムのオブジェクト(モデル)を対応づけ、SQLを直接書かなくてもデータを読み書きできるようにする仕組みのことです。Eloquentは というパターンを採用しており、「1つのモデルが1つのテーブルに対応し、そのモデル自身がDB操作の方法を持つ」のが特徴です。
なぜORMを使うのか
生SQLをコードのあちこちに書くと、テーブル構造を変えたときに全SQLを直す羽目になり、記述もばらつきます。ORMを使うと、DB操作を「モデルのメソッド呼び出し」という統一された形で書けるため、可読性が上がり、DBの種類が変わっても書き方を大きく変えずに済みます。設計としては『DBアクセスの共通言語を用意する』ものだと捉えると分かりやすいです。
モデルとテーブルの対応
Eloquentには「規約(命名のお約束)」があります。モデル名を単数形にし、テーブル名はその複数形にする、というのが基本です。例えば「Post」モデルは「posts」テーブルに、「User」モデルは「users」テーブルに自動で対応します。この規約に従っていれば、対応関係を明示的に書く必要はありません。
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
// モデル名 Post → テーブル posts に自動対応
// 主キー id、created_at / updated_at も規約で自動的に扱われる
// 一括代入を許可する項目(mass-assignment 対策)
protected $fillable = ['title', 'body'];
}補足
テーブルの列そのものは、Eloquentではなく (テーブル定義をコードで管理する仕組み)で作ります。Eloquentは「できたテーブルをどう操作するか」を担当します。
CRUD: 作成・取得・更新・削除
データ操作の基本はCRUD(Create/Read/Update/Delete)です。Eloquentではこれらをモデルのメソッドで直感的に書けます。
// Create: 作成
$post = Post::create(['title' => '入門', 'body' => '本文']);
// Read: 取得
$all = Post::all(); // 全件
$one = Post::find(1); // 主キーで1件(無ければ null)
$req = Post::findOrFail(1); // 無ければ404を投げる
$some = Post::where('title', '入門')->get(); // 条件で絞る
// Update: 更新
$post->title = '入門(改訂)';
$post->save();
// Delete: 削除
$post->delete();落とし穴
「Post::all()」は文字通り全件をメモリに読み込みます。行数が多いテーブルで安易に使うとメモリを圧迫します。実務では必要な件数だけを取る(where や paginate で絞る)意識が大切です。この『DB側で絞る』考え方はLesson5で詳しく扱います。
面接ではこう言う
「EloquentはLaravelのORMで、アクティブレコード方式でモデルとテーブルを対応させます。私はモデル名の単数形とテーブル名の複数形という規約に沿って書き、SQLを直書きせずCRUDを統一的に表現します。ただしall()で全件取るような書き方は避け、必要な分だけ取る意識を持っています」と説明できます。
読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。
理解度チェック
答えられれば、面接で説明できる状態に一歩近づきます。
EloquentのようなORMを使う主な狙いとして、最も適切なものはどれか。
「アクティブレコード」とはどんな考え方か、Eloquentを例に説明せよ。
記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。