Laravelを使って、子、孫を含めた3つのテーブルからid(主キー)が一致するデータを取得(Eloquentリレーション、ネスト)し、一覧ページで表示する方法をご紹介します。
3つのテーブル構造
以下の3つのテーブルを用意しました。listpagesテーブルから商品を登録したユーザーが登録されてるusersテーブル(子)。usersテーブルに登録されてる都道府県id(todofuken_id)と一致するtodofukensテーブル(孫)の都道府県名(prefecture)を表示させます。
todofukensテーブル(孫)
名前 | 説明 |
---|---|
id | 主キー |
prefecture | 都道府県名 |
usersテーブル(子)
名前 | 説明 |
---|---|
id | 主キー |
name | ユーザー名 |
メールアドレス | |
todofuken_id | 都道府県ID=todofukensテーブルのid ※todofukensテーブルのテーブル名から「s」を除いた名前「todofuken」とtodofukensテーブルの主キー「id」にアンダーバー「_」を付けた名前「todofuken_id」にする必要があります。こうすることでtodofukensテーブルからidが一致したデータを取得することができます。 |
listpagesテーブル
名前 | 説明 |
---|---|
id | 主キー |
product_name | 商品名 |
user_id | 商品登録ユーザーID=usersテーブルのid ※usersテーブルのテーブル名から「s」を除いた名前「user」とusersテーブルの主キー「id」にアンダーバー「_」を付けた名前「user_id」にする必要があります。こうすることでusersテーブルからidが一致したデータを取得することができます。 |
子、孫を含めた3つのテーブルからリレーションデータを取得するためのModelの記述
※ListpageモデルにUserモデル、Todofukenモデルのデータを取得する記述をします。
class Listpage extends Model { public function user() { //Userモデルのデータを取得する return $this->belongsTo('App\User'); } public function todofukens() { //Todofukenモデルのデータを取得する return $this->belongsTo('App\Todofuken'); } }
子、孫を含めた3つのテーブルからリレーションデータを取得するためのControllerの記述
※listpagesテーブルのuser_idと一致するusersテーブルからidとnameを取得します。usersテーブルのtodofuken_idと一致するtodofukensテーブルからidとprefectureを取得します。
with([‘user:id,name’,’user.todofuken:id,prefecture’])を使うことでusersテーブルから取得したいカラムのデータを指定し、usersテーブルにネストしたtodofukensテーブルの取得したいカラム(id,prefecture)を指定して取得します。
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','user.todofuken:id,prefecture'])->orderBy('id', 'asc')->paginate(20); return view('listpages', [ 'listpages' => $listpages, ]); }
子、孫を含めた3つのテーブルからリレーションデータを取得するためのデータを表示させるview(一覧ページ)の記述
※listpagesテーブルの孫テーブルとなるtodofukensテーブルの都道県を表示させる場合は「{{ $listpage->user->todofuken->prefecture }}」を記述します。
<table> <thead> <th>商品名</th> <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> <!-- 都道府県 --> <td class="table-text"> <div>{{ $listpage->user->todofuken->prefecture }}</div> </td> </tr> @endforeach </tbody> </table>
Routeの記述
※ページURLは必要に応じて変更して下さい。
Route::get('/listpages', 'ListpagesController@listdata');
※流用される場合は自己責任でお願いします。