【Laravel】attachとsyncWithoutDetachingの使い分け
はじめに
多対多のリレーションで関連付けたいときはattach
!と覚えていたのですが
中間テーブルにユニーク制約を貼ってる場合にattach
を連続で実行してしまうとエラーになる。。
(ユニーク制約がなければ同一レコードが複数できる)
うーん、困った。
そんなときはsyncWithoutDetaching
を使いましょう。
挙動の違い
attach
- 常にinsert
syncWithoutDetaching
- なければinsert、あれば何もしない
ということで、AとBの関係性が
- 複数あり得る場合は
attach
- 最大1つの場合は
syncWithoutDetaching
が良いよ!
公式のサンプルではユーザーにロールを与える際にattach
をしていますが
一人のユーザーに同じ権限を複数与える(Aさんにadmin権限2個)といったことはないので
syncWithoutDetaching
がオススメ。
attachの使い所
- 買い物カゴに商品を入れる
- 同じ商品を複数入れる可能性があるため
- (パッと思い付かないな)
syncWithoutDetachingの使い所
- 商品をお気に入り登録する
- ユーザーにロールを与える