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');
※流用される場合は自己責任でお願いします。