2016-12-23 23 views
2

私は4つのテーブルを持っています。それらのうちの2つはの単一形であり、そのうち2つは多形です。Laravel - belongsTo関係を持つモデルの多型関係を削除する方法は?

単形: テンプレート、モジュール

ポリモーフィック: 文書、画像今

templatesmodulesdocumentsimagesの両方を持っており、各Templateは多くのModule秒を持っており、modulesは外部キーを持っていますtemplatesの削除時にカスケードするように設定されています。

Templateを削除すると、対応するModuleが削除されますが、関連する多型関係Moduleはデータベースに残ります。私は全く無知だから何も試していない。

Templateが削除されたときに、Moduleの関連付けを自動的に削除するには何もできますか?私はこの中の削除はデータベース自体によって処理されていると思うし、Eloquentはそれと関係がない。

+0

削除する行を削除メソッドに追加するだけです。 – lewis4u

+0

@ lewis4uあなたが示唆しているのは、最初に関連するモジュールをチェックしてから、モジュールごとにドキュメントとイメージをチェックし、それらを1つずつ削除します。 –

答えて

1

多相関係であるため、カスケード削除は外部キーによって処理できません。

削除をデータベースレベルで処理したい場合は、データベースのトリガー機能の種類を記述する必要があります。

これをアプリケーションレベルで処理したい場合は、2つのオプションもあります。

あなたのコードを更新してTemplateを削除するようにすることもできますが、そのすべての多型関係も必ず削除してください。

もう1つの方法は、deletingイベントのイベントハンドラを作成することです。 deletingイベントは、Eloquentモデルを削除するたびにEloquentによって発生します。この削除イベントの中で、多型関係にアクセスして削除することもできます。

deletingイベントメソッドが正常に聞こえる場合は、このすべてを実装するパッケージがあり、モデルのセットアップが非常に簡単になります(shiftonelabs/laravel-cascade-deletes)。完全開示:私はパッケージを書いた。このパッケージでは

、あなたは自分のTemplateモデルにCascadesDeletes形質を追加し、Templateインスタンスが削除されたときに削除するすべての関係の配列が含まれ$cascadeDeletesプロパティを追加します。

関連する問題