カテゴリ: Laravel 更新日: 2026/03/29

LaravelのEloquent活用術まとめ!実務でよく使うテクニック集

LaravelのEloquent活用術まとめ!実務でよく使うテクニック集
LaravelのEloquent活用術まとめ!実務でよく使うテクニック集

先生と生徒の会話形式で理解しよう

生徒

「LaravelのEloquentって便利そうだけど、実務でよく使うテクニックってありますか?」

先生

「もちろんです。Eloquentはデータベース操作を簡単にするための便利な機能がたくさんあります。今日は初心者でも使いやすい実務向けのテクニックをまとめて紹介します。」

生徒

「具体的にどんなことができるんですか?」

先生

「リレーションの取得、条件検索、集計、更新や削除、さらに便利なメソッドなどを順番に解説します。」

1. 基本的なレコード取得(全件取得と条件検索)

1. 基本的なレコード取得(全件取得と条件検索)
1. 基本的なレコード取得(全件取得と条件検索)

LaravelのEloquent(エロクアント)を使えば、SQL文を直接書かなくても、モデルクラスを通じて直感的にデータベース操作が可能です。プログラミング未経験の方でも、まずは「全件取得」と「条件絞り込み」の2つを覚えれば、基本のデータ表示ができるようになります。

全てのデータを取得する:all()

例えば、会員サイトで登録されている全てのユーザーを表示したい場合は、Userモデルに対してall()メソッドを使用します。


// Userテーブルの全データを取得
$users = User::all();

// 取得したデータから一人ずつ名前を表示する例
foreach ($users as $user) {
    echo $user->name;
}

これだけで、内部的にはSELECT * FROM users;というSQLが実行され、結果を扱いやすい「コレクション」という形式で返してくれます。

特定の条件で絞り込む:where()とget()

実務では「退会していないユーザーだけ」や「特定のIDのデータだけ」のように、条件を指定することがほとんどです。その際はwhere('カラム名', '値')を使い、最後にget()を付けることで、条件に合致したデータだけを取得できます。


// 「ステータス(active)が1(有効)」のユーザーだけを検索
$activeUsers = User::where('active', 1)->get();

実行結果のイメージは以下の通りです。条件に合うデータが複数あれば、それらがリスト形式で取得されます。


// $activeUsersの中身(イメージ)
[
    {"id": 1, "name": "田中太郎", "active": 1},
    {"id": 3, "name": "佐藤花子", "active": 1}
]

このように、直感的な単語(all, where, get)を繋げるだけで複雑な検索ができるのがEloquentの最大のメリットです。基本を押さえることで、管理画面の作成やAPI開発など、実務のあらゆる場面で応用が効くようになります。

2. リレーションを活用してデータ操作を効率化する

2. リレーションを活用してデータ操作を効率化する
2. リレーションを活用してデータ操作を効率化する

Laravelの「Eloquent(エロクアント)」が持つ最大の特徴の一つが、リレーション(Relation)です。リレーションとは、テーブル同士の「つながり」をプログラム上で再現する仕組みのことです。

例えば、「1つのブログ記事(Post)」に対して「たくさんのコメント(Comment)」が付く場合、これを「1対多」のリレーションと呼びます。リレーションを設定しておけば、難しいSQLを書かなくても、直感的に関連データを取得できます。

基本的なデータの取得方法

まずは、特定の記事に紐付いたコメントをすべて表示する、初心者向けのシンプルな例を見てみましょう。


// IDが1の投稿を探す
$post = Post::find(1);

// その投稿に紐付いているコメントを「プロパティ」のように取得
$comments = $post->comments;

foreach ($comments as $comment) {
    echo $comment->body;
}

このように、$post->comments と書くだけで、Laravelが裏側で自動的にコメントテーブルからデータを検索してくれます。

条件を指定してリレーション先を検索する(whereHas)

「コメントがある記事だけを表示したい」「さらに、承認済みのコメントが付いている記事に絞りたい」という高度な検索も、whereHasを使えば簡単です。


// 「承認済み(approved)」のコメントを1つ以上持つ投稿だけを取得
$posts = Post::whereHas('comments', function($query) {
    $query->where('approved', true);
})->get();

このコードを実行すると、条件に合致する投稿だけがリストアップされます。実行結果のイメージは以下の通りです。


取得された投稿タイトル:
・Laravelの基本について(承認済コメントあり)
・Eloquentの使い方(承認済コメントあり)
※コメントがない投稿や、未承認の投稿は表示されません。

リレーションを使いこなすことで、コードの記述量を劇的に減らしつつ、データベースの検索パフォーマンスと可読性を両立させることが可能になります。

3. 集計やソートを活用する

3. 集計やソートを活用する
3. 集計やソートを活用する

レコードの件数を数えたり、平均値を取得したりすることも簡単です。


$userCount = User::count();
$averageAge = User::avg('age');
$recentPosts = Post::orderBy('created_at', 'desc')->get();

集計やソートを組み合わせると、実務でのレポート作成などに役立ちます。

4. レコードの更新と削除

4. レコードの更新と削除
4. レコードの更新と削除

取得したレコードはそのまま更新や削除が可能です。


$user = User::find(1);
$user->name = '新しい名前';
$user->save();

User::where('active', false)->delete();

条件を付けて一括削除することもでき、日常のメンテナンス作業でよく使われます。

5. Eager Loadingで効率化

5. Eager Loadingで効率化
5. Eager Loadingで効率化

リレーションを取得する際にN+1問題(データベースへのアクセスが増えすぎる問題)が起こることがあります。これを防ぐにはwithを使ったEager Loadingが有効です。


$posts = Post::with('comments')->get();

これにより、必要なリレーション情報をまとめて取得でき、処理が高速になります。

6. スコープを活用した再利用可能な条件

6. スコープを活用した再利用可能な条件
6. スコープを活用した再利用可能な条件

モデルにスコープを定義すると、よく使う条件を簡単に再利用できます。


class User extends Model {
    public function scopeActive($query) {
        return $query->where('active', true);
    }
}

$activeUsers = User::active()->get();

これで、どこでもactive()を呼ぶだけでアクティブユーザーを取得できます。

7. ソフトデリートで安全に削除

7. ソフトデリートで安全に削除
7. ソフトデリートで安全に削除

削除したレコードを復元できるようにする場合は、ソフトデリートを使います。


use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model {
    use SoftDeletes;
}

$post->delete(); // 論理削除
Post::withTrashed()->get(); // 削除済みも含めて取得
$post->restore(); // 復元

データを誤って消してしまうリスクを減らすことができるため、実務で重宝します。

8. 便利なメソッド活用

8. 便利なメソッド活用
8. 便利なメソッド活用

Eloquentには便利なメソッドが多くあります。例えば、firstOrCreateupdateOrCreateです。


$user = User::firstOrCreate(
    ['email' => 'test@example.com'],
    ['name' => 'テストユーザー']
);

存在しなければ作成し、存在すれば取得するという操作を1行で実現できます。

まとめ

まとめ
まとめ

ここまでLaravelの強力なORマッパーであるEloquent(エロクアント)の活用術について詳しく解説してきました。Eloquentを使いこなすことは、単にコードの記述量を減らすだけでなく、アプリケーション全体のパフォーマンス向上やメンテナンス性の確保に直結します。

実務で差がつくEloquentのポイント

実務において最も重要なのは、いかに効率よくデータベースと対話するかです。特に「Eager Loading」によるN+1問題の解決や、モデル内にロジックを共通化する「ローカルスコープ」の活用は、中規模以上のプロジェクトでは必須のスキルと言えるでしょう。これらを活用することで、コントローラーが肥大化するのを防ぎ、読みやすく再利用性の高いコードを実現できます。

Eloquentの強力なデータ操作

データの更新や削除においても、Eloquentは安全かつ直感的なインターフェースを提供しています。論理削除(ソフトデリート)を導入することで、ユーザーの誤操作によるデータ消失リスクを最小限に抑えつつ、バックエンドでのデータ管理を柔軟に行うことが可能です。また、updateOrCreateのような便利なメソッドを活用すれば、冗長な条件分岐を記述することなく、シンプルにロジックを組むことができます。

例えば、特定の条件でユーザーのステータスを一括で更新し、その結果を確認するような処理も、Eloquentなら数行で完結します。


// 特定の条件を満たすユーザーを一括更新し、その後の集計を行う例
User::where('last_login_at', '<', now()->subMonths(6))
    ->active()
    ->update(['active' => false]);

$inactiveCount = User::where('active', false)->count();

echo "非アクティブ化されたユーザー数: " . $inactiveCount;

非アクティブ化されたユーザー数: 15

リレーションシップの深い理解

単一のテーブル操作だけでなく、テーブル間の繋がりをEloquentのリレーションとして定義することで、SQLを直接書くよりも遥かに安全に結合データを取得できます。whereHaswithCountといったメソッドを組み合わせれば、複雑な条件検索もPHPのメソッドチェーンで美しく表現できます。

最後に:継続的な学習の重要性

Laravelは進化が早く、Eloquentにも新しいメソッドが随時追加されています。公式ドキュメントを定期的にチェックし、最新の書き方をキャッチアップしていくことが、エンジニアとしての価値を高める近道です。今回紹介したテクニックを土台にして、ぜひ実際のプロジェクトでコードを書きながら、その便利さを体感してみてください。

先生と生徒の振り返り会話

生徒

「先生、ありがとうございました!Eloquentってただのデータ取得ツールだと思っていましたが、実は設計そのものに深く関わっているんですね。」

先生

「その通りです。特に『N+1問題』については、意識していないとアプリが重くなる原因になります。with()を使う癖をつけておくといいですよ。」

生徒

「はい!さっきのwith()を使って、投稿一覧とそれぞれのコメント数を一気に取得するコードを練習してみました。これで合っていますか?」


// 全投稿と、それぞれの投稿に紐づく承認済みコメントを事前に読み込む
$posts = Post::with(['comments' => function($query) {
    $query->where('approved', true);
}])->get();

foreach ($posts as $post) {
    echo "タイトル: " . $post->title . " (コメント数: " . $post->comments->count() . ")\n";
}

先生

「素晴らしいですね。クロージャを使ってリレーション先にも条件を付けられているのでバッチリです。さらにコメント数だけ知りたい場合はwithCount('comments')を使うともっと効率的ですよ。」

生徒

「なるほど、目的に合わせて最適なメソッドを選ぶのがコツなんですね。ソフトデリートも、実際の現場では『間違えて消しちゃった!』というトラブルが多そうなので、絶対に設定しておこうと思います。」

先生

「そうですね。実務では『データの整合性』と『復旧のしやすさ』が非常に重視されます。スコープを使ってUser::active()->get()のように書くのも、チーム開発で条件の定義がバラバラにならないための知恵なんです。」

生徒

「たしかに、自分一人で書いていると where('status', 1) だったり where('active', true) だったり、書き方がブレてしまいそうです。スコープで共通化するのは理にかなっていますね。」

先生

「その視点を持てているのは素晴らしいです!Eloquentは奥が深いですが、まずは基本的なCRUD操作とリレーションをマスターして、徐々に高度なクエリビルダの機能にも挑戦していきましょう。」

生徒

「ありがとうございます!まずは今のプロジェクトのクエリを見直して、もっとスマートな書き方にリファクタリングしてみます!」

カテゴリの一覧へ
新着記事
New1
Symfony
Symfonyのルーティング構成の基本を完全解説!初心者向けにYAML・PHP・アノテーション方式をやさしく紹介
New2
Laravel
Laravelのルートグループの使い方!初心者でもわかるprefixやミドルウェアの設定方法
New3
PHP
PHPのswitch文の使い方!多くの条件分岐をスッキリ書く方法と注意点
New4
Symfony
Symfony学習に役立つおすすめドキュメント・教材・リソース一覧【初心者向け】
人気記事
No.1
Java&Spring記事人気No1
PHP
PHPで文字列を結合する方法!ドット演算子と代入演算子の使い方を徹底解説
No.2
Java&Spring記事人気No2
PHP
PHPのif文の使い方を完全ガイド!初心者でもわかる条件分岐の基本
No.3
Java&Spring記事人気No3
Symfony
Symfonyで翻訳(i18n)機能を使う方法を解説!初心者にもわかる国際化対応の基本
No.4
Java&Spring記事人気No4
Laravel
Laravelのresponse()関数の使い方を完全ガイド!初心者でもわかるレスポンス制御とHTTPレスポンスの基本
No.5
Java&Spring記事人気No5
CodeIgniter
CodeIgniterルーティングを完全攻略!正規表現でURLを自由自在に操る方法
No.6
Java&Spring記事人気No6
Laravel
LaravelのAPIルーティングを設定する方法!初心者でもわかるapi.phpの使い方
No.7
Java&Spring記事人気No7
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.8
Java&Spring記事人気No8
Laravel
LaravelでRemember Me(ログイン状態保持)機能を実装する方法を完全解説!初心者でも安心の認証入門