私の理解が正しければ、両方のテーブルでソフト削除をカスケードしようとしていますか?
ON UPDATE CASCADE でこれを行うのは正しいアプローチではないと思います。その理由を説明しようと思います...
これを行うには、外部キーと複合キーの関係を作成する必要があります。
つまり、(events.user_id と deleted_at) を (user.id と delete_at) にリンクする必要があります。一方を変更すると、他方が更新されます。
null 値にリンクすることはできないため、まず、deleted_at 列にデフォルトのルールを追加する必要があります。
したがって、両方のテーブルの移行に追加してください...
$table->softDeletes()->default('0000-00-00 00:00:00');
「id」と「deleted_at」を使用して一意のキーをユーザー テーブルに追加します。
Schema::table('users; function($table) {
$table->unique(array('id','deleted_at'))
});
次に、イベントテーブルでそのように外部キーを作成します(一意のキーへのリンク)
Schema::table('events; function($table) {
$table->foreign(array('user_id','deleted_at'),'events_deleted_at_foreign_key')->
}->references(array('id','deleted_at'))->on('users')->onUpdate('CASCADE'));
これを実行すると、ユーザーをソフト削除すると、イベントがソフト削除されることがわかります。
ただし、ここでイベントをソフト削除しようとすると、外部キーの制限で失敗します。なぜあなたは尋ねるかもしれません!?
あなたがしているのは、両方のテーブルで id,deleted_at を使用して親子関係を作成することです。親を更新すると、子が更新されます。そして、その関係は途切れることはありません。ただし、子を更新すると、関係が壊れて、子がテーブルに孤立したままになります。これは、外部キーの制限に失敗します。
すっごく長い答えですが、うまくいけば、あなたがやろうとしていることがうまくいかない理由の良い説明があり、ON UPDATE CASCADE でこれをやろうとしている時間を大幅に節約できます. TRIGGERS に入り、実行しようとしているものを処理する関数を TRIGGER するか、アプリケーションで処理します。個人的には TRIGGERS を使用して行うので、データベースは独自のエンティティのままであり、データの整合性を維持するために何かに依存する必要はありません。
delimiter //
CREATE TRIGGER soft_delete_child AFTER UPDATE ON db.users FOR EACH ROW BEGIN IF NEW.deleted_at <> OLD.deleted_at THEN UPDATE events SET deleted_at=NEW.deleted_at WHERE events.user_id=NEW.id; END IF; 終わり;
// デリミタ;