one-to-manyやmany-to-manyのリレーションで一気に全ての紐づけを消す方法メモ。
October CMSのドキュメントみても載ってなかったのですぐに分からなかったが、[Laravelの機能][l1]を使えばいいだけだった。ということで、Octoberと言うよりLaravelの話だった。
[l1]:https://laravel.com/docs/5.5/eloquent-relationships
one-to-many
EloquentモデルではhasMany
にあたる。
hasManyをクリアするには、紐付いたモデルデータ自体を削除する。(未検証)
$product->pictures()->delete();
紐づけは子データ(上記例で言うとpicture)が持っており親データ(product)は持っていない。紐づけをなくすと小データがみなしご(オーファン)になってしまうので紐づけを消すのではなく子データ自体を削除する。ということで、HasMany::delete()
が子データを削除するので、これでOK。
many-to-many
EloquentモデルではbelongsToMany
にあたる。
belongsToMany
ではdelete
ではダメ。紐付けデータはpivotテーブルにあるため、子データを削除ても紐付けだけが残ってしまう。
また、belongsToMany
の場合子データは他のデータにも紐付いている可能性があるのでリレーションの削除で子データも削除すべきではない。
そこでBelongsToMany::detach()
を使う。
$product->categories()->detach();
BelongsToMany::detach()
はリレーションを削除するだけで、子データは削除しない。
もし、子データも消し去りたければ、下記のようにdelete
を呼べば良いかな。(未検証だけど)
$product->categories()->delete();
$product->categories()->detach();
おまけ
余談だが、sync([])
でもdetach()
と同じことができる。
$product->categories()->sync([]);