この記事では、Laravelを使って2つのテーブルからIDが一致するデータを取得し、一覧ページで表示する方法をご紹介します。
この方法は、データベースのテーブル結合を使用して異なるテーブル間のデータを連携する際に役立ちます。Eloquent ORMのリレーション機能を使った多対1のデータ取得を実装していきます。初心者でも理解しやすいよう、コード例とともに解説します。
IDが一致するデータを取得する2つのテーブル構造
今回の例では、商品情報を格納する「listpages」テーブルと、ユーザー情報を格納する「users」テーブルの2つのテーブルを用意しています。商品情報の一覧ページで商品名を表示するだけでなく、その商品を登録したユーザー名も併せて表示します。
以下の2つのテーブルを用意しました。listpagesテーブルから「商品名」を一覧ページで表示さたいのですがあわせて商品を登録した「ユーザー名」も表示させます。
usersテーブルの構造
ユーザー情報を格納する「users」テーブルには、以下のフィールドが含まれています。
名前 | 説明 |
---|---|
id | 主キー |
name | ユーザー名 |
メールアドレス |
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のリレーション機能を活用することで、異なるテーブル間のデータを簡単に取得し、表示することができます。
初心者でも実装しやすいように、ステップごとに説明しました。データベース操作やリレーション設定に慣れるために、実際にコードを書いて動作を確認してみてください。
※流用される場合は自己責任でお願いします。