Laravelを使ってDBの2つのテーブルからIDが一致する(テーブル結合)データを取得し、一覧ページで表示する方法をご紹介します。Eloquent(エロクエント)リレーションの多対1のデータを取得する方法です。
IDが一致するデータを取得する2つのテーブル構造
以下の2つのテーブルを用意しました。listpagesテーブルから「商品名」を一覧ページで表示さたいのですがあわせて商品を登録した「ユーザー名」も表示させます。
usersテーブル
名前 | 説明 |
---|---|
id | 主キー |
name | ユーザー名 |
メールアドレス |
listpagesテーブル
名前 | 説明 |
---|---|
id | 主キー |
product_name | 商品名 |
user_id | 商品登録ユーザーID=usersテーブルのid ※usersテーブルのテーブル名から「s」を除いた名前「user」とusersテーブルの主キー「id」にアンダーバー「_」を付けた名前「user_id」にする必要があります。こうすることでusersテーブルからidが一致したデータを取得することができます。 |
2つのテーブルからIDが一致するデータを取得するためのModelの記述
※Listpageモデル(listpagesテーブルデータを取得)にUserモデル(usersテーブルデータを取得)の記述をします。
class Listpage extends Model
{
public function user()
{
//Userモデルのデータを取得する
return $this->belongsTo('App\User');
}
}
2つのテーブルからIDが一致するデータを取得するためのControllerの記述
※listpagesテーブルのuser_idと一致するusersテーブルから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,
]);
}
2つのテーブルからIDが一致するデータを表示させるview(一覧ページ)の記述
※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>
Route(ページURL)の記述
※「https:// ~ /listpages」にアクセスすると一覧ページが表示されます。ページURLは必要に応じて変更して下さい。
Route::get('/listpages', 'ListpagesController@listdata');
※流用される場合は自己責任でお願いします。