LLaravel Bootcamp

Day 4Eloquentとリレーションと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」テーブルに自動で対応します。この規約に従っていれば、対応関係を明示的に書く必要はありません。

PHP
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ではこれらをモデルのメソッドで直感的に書けます。

PHP
// 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();
Eloquentによる基本のCRUD

落とし穴

「Post::all()」は文字通り全件をメモリに読み込みます。行数が多いテーブルで安易に使うとメモリを圧迫します。実務では必要な件数だけを取る(where や paginate で絞る)意識が大切です。この『DB側で絞る』考え方はLesson5で詳しく扱います。

面接ではこう言う

「EloquentはLaravelのORMで、アクティブレコード方式でモデルとテーブルを対応させます。私はモデル名の単数形とテーブル名の複数形という規約に沿って書き、SQLを直書きせずCRUDを統一的に表現します。ただしall()で全件取るような書き方は避け、必要な分だけ取る意識を持っています」と説明できます。

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

EloquentのようなORMを使う主な狙いとして、最も適切なものはどれか。

Q2

「アクティブレコード」とはどんな考え方か、Eloquentを例に説明せよ。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。