Laravel

【Laravel】DBの2つのテーブルからIDが一致するデータを取得する方法(Eloquentリレーション)

この記事では、Laravelを使って2つのテーブルからIDが一致するデータを取得し、一覧ページで表示する方法をご紹介します。
この方法は、データベースのテーブル結合を使用して異なるテーブル間のデータを連携する際に役立ちます。Eloquent ORMのリレーション機能を使った多対1のデータ取得を実装していきます。初心者でも理解しやすいよう、コード例とともに解説します。

IDが一致するデータを取得する2つのテーブル構造

今回の例では、商品情報を格納する「listpages」テーブルと、ユーザー情報を格納する「users」テーブルの2つのテーブルを用意しています。商品情報の一覧ページで商品名を表示するだけでなく、その商品を登録したユーザー名も併せて表示します。
以下の2つのテーブルを用意しました。listpagesテーブルから「商品名」を一覧ページで表示さたいのですがあわせて商品を登録した「ユーザー名」も表示させます。

usersテーブルの構造

ユーザー情報を格納する「users」テーブルには、以下のフィールドが含まれています。

名前 説明
id 主キー
name ユーザー名
email メールアドレス

listpagesテーブルの構造

次に、商品情報を格納する「listpages」テーブルの構造を確認します。このテーブルには、商品名と登録ユーザーのIDが含まれます。

名前 説明
id 主キー
product_name 商品名
user_id 商品登録ユーザーID=usersテーブルのid
※usersテーブルのテーブル名から「s」を除いた名前「user」とusersテーブルの主キー「id」にアンダーバー「_」を付けた名前「user_id」にする必要があります。こうすることでusersテーブルからidが一致したデータを取得することができます。

このuser_idは、usersテーブルの主キー(id)と結びついており、「user_id」にすることで自動的にusersテーブルとのリレーションが確立されます。LaravelのEloquentでは、テーブル名の単数形と主キー名にアンダースコアを追加した名前でリレーションが作られるため、この命名規則を活用します。

2つのテーブルからIDが一致するデータを取得するリレーション設定 – Modelの記述

コントローラーでデータを取得する方法について説明します。listpagesテーブルからuser_idと一致するユーザーのidおよびnameを取得します。これにより、リスト表示の際にユーザー情報も一緒に取得できます。
Listpageモデル(listpagesテーブルデータを取得)にUserモデル(usersテーブルデータを取得)の記述をします。

class Listpage extends Model
{
	public function user()
	{
		//Userモデルのデータを取得する
	    return $this->belongsTo('App\User');
	}
}

このリレーションメソッドは、Listpageモデルに対応するuserレコードを取得できるようにします。EloquentのbelongsToメソッドにより、usersテーブルとリレーションを作成しています。

2つのテーブルからIDが一致するデータ取得 – Controllerの記述

コントローラーでデータを取得する方法について説明します。listpagesテーブルからuser_idと一致するユーザーのidおよびnameを取得します。これにより、リスト表示の際にユーザー情報も一緒に取得できます。

with(‘user:id,name’)を使うことでusersテーブルから取得したいカラムのデータを指定できます。
SQL文に変換すると「select tbl1.id, tbl1.product_name, tbl1.user_id, tbl2.id, tbl2.name from listpages tbl1, users tbl2 where tbl1.user_id = tbl2.id」になります。

use App\User;   //Userモデルを使用
use App\Listpage;   //Listpageモデルを使用


    public function listdata(Request $request)
    {
        $sort = $request->sort;
        $order = $request->order;

	//listpagesテーブルのuser_idと一致するusersテーブルからidとnameを取得します。
	$listpages = Listpage::with('user:id,name')->orderBy('id', 'asc')->paginate(20);

        return view('listpages', [
            'listpages' => $listpages,
        ]);
    }

この記述では、withメソッドを使って関連するusersテーブルのidとnameカラムのみを選択しています。これにより、リレーションを使用しつつ、効率的に必要なデータのみを取得することが可能です。

2つのテーブルからIDが一致するデータ表示 – View(一覧ページ)の記述

一覧ページでlistpagesテーブルの商品名と、対応するusersテーブルのユーザー名を表示する方法について説明します。リレーション設定により、ユーザー名を簡単に表示できるようになります。

listpagesテーブルの商品名を表示させる場合は「{{ $listpage->product_name }}」、usersテーブルの名前を表示させる場合は「{{ $listpage->user->name }}」と記述します。

                <table>
                    <thead>
                        <th>商品名</th>
                        <th>登録ユーザー</th>
                    </thead>
                    <tbody>
                        @foreach ($listpages as $listpage)
                            <tr>
                                <!-- 商品名 -->
                                <td class="table-text">
                                    <div>{{ $listpage->product_name }}</div>
                                </td>
                                <!-- 登録ユーザー -->
                                <td class="table-text">
                                    <div>{{ $listpage->user->name }}</div>
                                </td>
                            </tr>
                        @endforeach
                    </tbody>
                </table>

このように、リレーションを利用すると、商品名とユーザー名の取得および表示が簡単になります。LaravelのEloquentを活用することで、コードの可読性が向上し、メンテナンスが容易になります。

ルート設定 – Route(ページURL)の記述

最後に、ページのURLを設定します。Routeファイルにアクセスルートを追加することで、一覧ページを簡単に表示できるようにします。
「https:// ~ /listpages」にアクセスすると一覧ページが表示されます。ページURLは必要に応じて変更して下さい。

Route::get('/listpages', 'ListpagesController@listdata');

上記のコードをRouteファイルに追加することで、「https://~/listpages」にアクセスすると一覧ページが表示されます。ルート名やURLパスは必要に応じて変更してください。

まとめ

この記事では、Laravelを使った2つのテーブル間のデータ結合とリレーション設定方法について詳しく解説しました。Eloquentのリレーション機能を活用することで、異なるテーブル間のデータを簡単に取得し、表示することができます。
初心者でも実装しやすいように、ステップごとに説明しました。データベース操作やリレーション設定に慣れるために、実際にコードを書いて動作を確認してみてください。

 
※流用される場合は自己責任でお願いします。