💡

Laravelでユーザー登録を論理削除(SoftDeletes)した時に、関連する情報を論理削除する方法。

2023/11/03に公開

ユーザー登録削除に連動して投稿が消えてくれない

コメント機能があるサイトとかで、ユーザ登録を削除した場合、その人が投稿したコメントも一緒に削除したいとなります。

ユーザ登録削除に連動して投稿を削除したい場合は、migrationファイルに->onDelete('cascade')をつければよいと習うのですが、どうもこれは物理削除の場合だけのようで、論理削除の時は機能しませんでした。

migrationファイル
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

じゃあ、論理削除を連携させるにはどうすればよいのかということで調べてみました。

bootメソッドで解決!

User モデルにbootメソッドを定義することで、ユーザー登録削除に連動して投稿(post)も論理削除されるようになりました。

\Model\User.php
class User extends Authenticatable
{
	:
    public static function boot()
    {
        parent::boot();

        static::deleted(function ($user) {
            $user->posts()->delete();
        });
    }
}

bootメソッドはEloquentの初回呼び出し時に初期設定を行うもので、ここで投稿を削除するようにオーバーライドしているようです。

laravel-soft-cascadeライブラリを使用する方法

その他にも、laravel-soft-cascadeライブラリを使用する方法もあるようなので試してみましたが、私の環境だとlaravel-soft-cascadeをインストールすると、askedio/laravel-soft-cascade パッケージはバージョン 6.0.1 でインストールされたのですが、swiftmailer/swiftmailer と symfony/debug パッケージが非推奨であるとの警告が表示されました。

これが原因かはわかりませんが、私の未熟さもあって、ユーザー登録削除から投稿削除の連携まで辿り着けませんでした。

ということで、現時点の結論としては、bootメソッドを使うのが超カンタンでお勧めです。

Discussion