あっぽログ
← 記事一覧に戻る

LaravelのEloquent ORM入門:モデル・リレーション・クエリビルダを使いこなす

Eloquent ORMとは

LaravelにはEloquent(エロクアント)と呼ばれる強力なORM(Object-Relational Mapping)が組み込まれています。ORMとは、データベースのテーブルをPHPのクラス(モデル)として扱う仕組みです。生のSQLを書く代わりに、PHPのメソッドチェーンでデータ操作ができるため、コードが読みやすく保守性も高まります。

この記事では、Eloquentの基本的な使い方をステップごとに紹介します。


モデルの作成

まずはArtisanコマンドでモデルを生成しましょう。-mオプションを付けると、マイグレーションファイルも同時に作成されます。

php artisan make:model Post -m

生成された app/Models/Post.php は次のようになっています。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // 一括代入を許可するカラム
    protected $fillable = ['title', 'body', 'user_id'];
}

Eloquentは規約に従って、Post モデルが posts テーブルに対応していると自動で認識します。テーブル名を変えたい場合は $table プロパティで指定できます。


基本的なCRUD操作

レコードの取得

use App\Models\Post;

// 全件取得
$posts = Post::all();

// 主キーで1件取得(見つからない場合は例外)
$post = Post::findOrFail(1);

// 条件を指定して取得
$posts = Post::where('user_id', 1)
             ->orderBy('created_at', 'desc')
             ->get();

// 最初の1件だけ取得
$post = Post::where('title', 'like', '%Laravel%')->first();

レコードの作成

// createメソッドで一括作成($fillable の設定が必要)
$post = Post::create([
    'title' => 'Eloquent入門',
    'body'  => 'ORMは便利です。',
    'user_id' => 1,
]);

レコードの更新・削除

// 更新
$post = Post::findOrFail(1);
$post->update(['title' => '更新後のタイトル']);

// 削除
$post->delete();

リレーション(関連付け)

Eloquentの真価はリレーションにあります。テーブル間の関係をモデルのメソッドとして定義するだけで、関連データを直感的に扱えます。

1対多(hasMany / belongsTo)

「1人のユーザーが複数の投稿を持つ」関係を定義します。

// app/Models/User.php
public function posts(): \Illuminate\Database\Eloquent\Relations\HasMany
{
    return $this->hasMany(Post::class);
}
// app/Models/Post.php
public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
    return $this->belongsTo(User::class);
}

定義後は次のように関連データへアクセスできます。

$user = User::findOrFail(1);

// そのユーザーの全投稿を取得
$posts = $user->posts;

// 投稿の作者名を取得
$post = Post::findOrFail(1);
echo $post->user->name;

多対多(belongsToMany)

「投稿は複数のタグを持ち、タグも複数の投稿に属する」場合は belongsToMany を使います。中間テーブル(post_tag)が必要です。

// app/Models/Post.php
public function tags(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
{
    return $this->belongsToMany(Tag::class);
}
// タグの同期(中間テーブルを自動管理)
$post->tags()->sync([1, 2, 3]);

// タグ一覧の取得
foreach ($post->tags as $tag) {
    echo $tag->name;
}

N+1問題とEager Loading

リレーションを使う際によく起こるのが N+1問題 です。投稿一覧をループしながら各投稿の著者を取得すると、投稿の数だけSQLが発行されてしまいます。

// ❌ N+1問題が起きる例(100件あれば101回クエリが走る)
$posts = Post::all();
foreach ($posts as $post) {
    echo $post->user->name; // ここで毎回クエリ発行
}

これを防ぐには with メソッドによる Eager Loading を使います。

// ✅ Eager Loadingで2回のクエリにまとめる
$posts = Post::with('user')->get();
foreach ($posts as $post) {
    echo $post->user->name; // クエリは追加発行されない
}

複数のリレーションをまとめてロードすることもできます。

$posts = Post::with(['user', 'tags'])->get();

まとめ

Eloquent ORMを使うことで、データベース操作がシンプルで読みやすいコードになります。

機能メソッド
全件取得all()
条件付き取得where()->get()
作成create()
更新update()
削除delete()
Eager Loadingwith()

まずは基本的なCRUDとリレーションを押さえておけば、Laravelアプリ開発の大部分に対応できます。次のステップとして、スコープやアクセサ・ミューテタといった高度な機能にも挑戦してみてください。

← 記事一覧に戻る