Laravelで中間テーブルを活用する

アイキャッチ画像

中間テーブルとは?

中間テーブルとは、多対多のリレーションを実現するためのテーブルです。

Laravelにおいてテーブル名は複数形にするのが一般的ですが、中間テーブルに関しては双方のテーブル名の単数形で命名します。

どういう時に利用するの?

例えばユーザに複数の権限を設定したい場合などに使用します。

その他にもユーザが複数獲得出来るバッジや、画像をfilesテーブルで一括管理する場合のメニューと画像の紐付け、ブログ記事とタグなど色々な活用方法があります。

中間テーブルの登録・更新方法

まず前提としてModelにリレーションを設定します。

例えばメニューに紐付ける画像を中間テーブルとして保存したい場合は以下のようになります。

リレーションに対して紐付けたいIDの配列を利用してsyncするたけです。

簡単ですね!

ちなみに、元々紐付いていたファイルIDのうち使用されなくなったものは自動的に中間テーブルから削除されます。

中間テーブルの応用編

メニューの画像にソート順を指定したい場合はどうでしょうか?

まず中間テーブルにソート順を指定するカラムを追加します。ここでは「sort_no」というカラムを追加したという前提で進めます。

先ほどファイル保存用に使用していたメソッドsaveFilesを次のように変更します。

$file_idsをファイルIDの単純な配列にするのではなく、多次元の連想配列の中に各ファイルIDの子配列としてsort_noの値を指定すると中間テーブル上のsort_noを更新可能になります。

あとはメニューモデルのリレーションにソート順を指定します。

通常のorderByだとfilesテーブルの値を参照しようとするのでorderByPivotを利用します。

ソート順の他に表示、非表示のフラグを持たせたりすることも可能です。

親子テーブルとして保存するよりも非常にシンプルに更新が可能なので是非中間テーブルを活用してみてください!