Help us understand the problem. What is going on with this article?

OctoberCMSプラグイン作成:モデルのto-manyリレーションをクリアする

More than 1 year has passed since last update.

one-to-manyやmany-to-manyのリレーションで一気に全ての紐づけを消す方法メモ。

October CMSのドキュメントみても載ってなかったのですぐに分からなかったが、Laravelの機能を使えばいいだけだった。ということで、Octoberと言うよりLaravelの話だった。

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([]);
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away