0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-29

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([]);
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?