Laravelの中間テーブルに追加で情報を加えたいときのsync

Laravelの中間テーブルに追加で情報を加えたいときのsync

中間テーブルにアディショナルでデータを追加したい時に困ったのでメモしておきます。

まず、私が実現したかったこと

UsersテーブルとSkillsテーブルがあって、ユーザーページにスキル一覧のようなものを表示したかったです。

なので中間テーブルは、最初以下のようにしていました。

シンプルにskill_idとuser_idで紐付け多対多のリレーションを実現しています。

しかし、その後、スキルにそのスキルのレベル感も追加できるようにしたくなってしまいました。

そこで、中間テーブルにlevelのカラムを追加。

で取得することもできました。

しかし、記述するのに苦労したのです。

それまでは、syncを使って一発で中間テーブルを更新していたので、levelという値を渡す方法を知りませんでした。

公式では以下のように追加のデータを保存できると記述してありました。

だがしかし、これだと全てのスキルにおいて同じレベルしか記述されません。

上の例でいうと、1、2、3全てのカラムにおいて[‘expires’ => true]となってしまいます。

確かに

のように記述すればできるのかもしれなかったですが、これだとforeachとかでやろうとしたときにめんどくさい。

そこで発見した方法がattachとやらを使用する方法です。

まず最初に、syncで同期してしまって、その後にそれぞれにデータを追加します。

これであればattachの部分を繰り返し文で回せばオッケーなのでとても楽でした。

重複してる…

attachはsyncと違ってdeleteはしてくれないので、syncに使う配列からattachするものは取り除いておけばsync時に削除してくれて、かつその後attachで追加してくれるので重複が防げると思います。

ちなみに私の場合はこんな感じで。

取り除いてます。

というメモでした。

プログラミングカテゴリの最新記事