プログラム関係の備忘録。技術系記事1000記事以上を目指すブログ

【Laravel5.6】中間テーブルのデータを取ってくるときのポイント

  • 2018年7月9日
  • PHP
  • 693view
  • 0件
PHP

Laravelを使った中間テーブル取得方法のポイントをまとめます。

前提

テーブル同士の関係が多対多のデータを取得したい。
多対多の関係性についての説明は省略し、実際にlaravelで中間テーブルのデータを扱う方法を書きます。
例として、商品テーブル(items)と注文テーブル(orders)を扱う場合を想定。

モデルの定義

リレーションを宣言するために、それぞれのテーブルのモデルに以下を追記する。

Itemモデル

public function order()
{
    return $this->belongsToMany('App\Oder');
}

Orderモデル

public function item()
{
    return $this->belongsToMany('App\Item');
}
DBにはitem_orderテーブルが存在するが、モデルで関係を追記するのは中間テーブルに対してではなく関連させるテーブルに対してbelongsToMany()を指定しているのがポイント。
SQLの場合はitemテーブルと中間テーブルをjoinし、中間テーブルとorderテーブルをjoinするという方法が普通なので、その考え方が頭に入っていると逆に混乱を招きそう。

基本的にはこれだけで中間テーブルを自動的に判断してくれるわけだが、その為には中間テーブルの命名規則があるので、以下に記載。

・中間テーブルの命名規則
関連付けるテーブル名をアルファベット順にアンダーバーで繋げる。
例えばitemsとordersならitem_order、usersとitemsならitem_userといったテーブル名称にする。

・中間テーブルのカラム
中間テーブルのカラムには、中間テーブル自身のID、そして各テーブルのIDをカラムに持つ。
id,item_id,order_idといった感じ。

こうすることでSQLでいうテーブルのjoinを勝手にやってくれる。
当然関連付けるカラム名を指定することもでき、その場合はbelongsToMany()の引数にカラム名を追加する。
ただせっかく楽に書けるので、できれば最初からこの命名規則に従ったテーブルを作るのがおすすめ。

コントローラー

コントローラーではシンプルにモデルのデータをビューに渡す

・・・
$items = Item::all();
return view('testview', [
      ['items' => $items]);

ビュー

bladeでのデータの表示方法

@foreach ($items->order as $order)
    {{$order->name}}</span>
@endforeach