カテゴリ: Laravel 更新日: 2025/10/29

LaravelでEloquentのリレーションを扱う!withとloadで関連データを取得する方法

LaravelでEloquentを使ってリレーション先のデータを取得する方法(with, load)
LaravelでEloquentを使ってリレーション先のデータを取得する方法(with, load)

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

生徒

「Laravelでデータベースの関連データを一緒に取り出したいんですが、どうすればいいですか?」

先生

「Eloquent ORMを使えば、リレーションを簡単に扱えます。そのときに便利なのがwithloadです。」

生徒

withloadって、どう違うんですか?」

先生

「それでは、一緒に基本的な使い方を見ていきましょう!」

1. Eloquentのリレーションとは?

1. Eloquentのリレーションとは?
1. Eloquentのリレーションとは?

LaravelのEloquent ORMは、データベースのテーブル同士の関係(リレーション)をオブジェクトとして扱える仕組みです。例えば、ブログの記事とコメントの関係を考えてみましょう。記事(posts)にはたくさんのコメント(comments)が付けられます。このような「1対多」の関係を、Eloquentでは簡単に表現することができます。

リレーションを理解することで、「記事を取得するときに、同時にその記事に紐づくコメントも取得する」といった処理をスムーズに書けるようになります。

2. withで関連データを同時に取得する方法

2. withで関連データを同時に取得する方法
2. withで関連データを同時に取得する方法

withは、最初のデータを取得するときに「一緒に関連するデータも取ってきてください」と指示するためのものです。これを eager loading(イーガーローディング)と呼びます。データベースに何度もアクセスする無駄を減らし、効率よく情報を取得できます。


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

foreach ($posts as $post) {
    echo $post->title;
    foreach ($post->comments as $comment) {
        echo $comment->content;
    }
}

記事タイトル
コメント1
コメント2
記事タイトル
コメント1
コメント2

この例では、記事を取るときに「comments」リレーションも同時に取得しています。これにより、ループの中でコメントを表示しても、追加でデータベースにアクセスすることがなく効率的です。

3. loadで後から関連データを取得する方法

3. loadで後から関連データを取得する方法
3. loadで後から関連データを取得する方法

loadは、すでに取得したモデルに対して「後から関連データを読み込みたい」ときに使います。例えば、最初は記事だけを取り出しておいて、必要になった段階でコメントを読み込む、といった使い方が可能です。


$post = Post::first(); // 記事を1件だけ取得

// コメントを後から読み込む
$post->load('comments');

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

コメント1
コメント2
コメント3

この場合、最初の段階では記事だけを取得しており、あとでloadを使ってコメントを取得しています。柔軟にコントロールできるのが特徴です。

4. withとloadの使い分け

4. withとloadの使い分け
4. withとloadの使い分け

では、withloadはどう使い分けるべきでしょうか?

  • 最初から関連データも必要なとき → with
  • 状況に応じて後から関連データを追加したいとき → load

たとえば、記事一覧を表示するときはwithを使うほうが効率的です。一方で、記事の詳細ページを開いたときに「必要な場合だけコメントを取得する」といった使い方ならloadが便利です。

5. 複数のリレーションを同時に取得する

5. 複数のリレーションを同時に取得する
5. 複数のリレーションを同時に取得する

Eloquentでは、withloadで複数のリレーションを同時に指定することもできます。例えば、記事とコメント、さらにコメントを書いたユーザー情報を一度に取得することが可能です。


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

このように書けば、記事を取得すると同時に「記事を書いたユーザー情報」と「コメント」も取得できるので、ビュー(画面表示)でまとめて扱うことができます。

6. リレーション取得を使うメリット

6. リレーション取得を使うメリット
6. リレーション取得を使うメリット

リレーション先のデータをwithloadで取得するメリットは大きく分けて2つあります。

  1. パフォーマンスの向上:データベースへの無駄なアクセスを減らし、アプリケーションの動作を軽くできます。
  2. コードのシンプル化:複雑なSQLを書かずに、オブジェクトとして自然に関連データを扱えるので、初心者でも直感的に理解できます。

特に大規模なアプリケーションになると、リレーションを正しく使うかどうかで処理速度や可読性に大きな差が出ます。

関連記事:
カテゴリの一覧へ
新着記事
New1
Laravel
Laravelの認証状態をチェックする方法を完全解説!authとAuth::check()を初心者向けにやさしく説明
New2
CodeIgniter
CodeIgniterのコントローラクラスの作り方を完全ガイド!初心者でもわかる基礎から実践まで
New3
Symfony
Symfonyのフォームラベルを多言語対応!初心者でもわかる翻訳設定ガイド
New4
Laravel
Laravelでユーザー登録機能を作る方法!初心者向けにバリデーションとリダイレクトをやさしく解説
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのデータベース設定方法を完全ガイド!初心者でもわかる.envファイルの使い方
No.2
Java&Spring記事人気No2
Laravel
Laravelのビューとは?Bladeテンプレートの基本を解説
No.3
Java&Spring記事人気No3
Laravel
Laravelでセッションを扱う方法!保存方法と利用例を解説
No.4
Java&Spring記事人気No4
Laravel
Laravelのルート一覧を確認する方法!初心者でもわかるphp artisan route:listの使い方
No.5
Java&Spring記事人気No5
Laravel
Laravelでルーティングを設定する方法!web.phpと基本ルートの書き方を初心者向けに徹底解説
No.6
Java&Spring記事人気No6
Laravel
Laravelのルートキャッシュ機能を活用してパフォーマンス改善!初心者でもわかる完全ガイド
No.7
Java&Spring記事人気No7
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.8
Java&Spring記事人気No8
Laravel
LaravelでルートをBladeテンプレートに記述する方法(route関数)