モデルの削除時に何か処理をしたい場合、下記のように実装することができます。
class Post extends Model
{
public static function boot()
{
parent::boot();
self::deleting(function ($item) {
// 削除時の処理
:
:
});
}
}
例えば、削除するレコードに関連した別のレコードを更新する、レコードが削除されたことを通知する(ここに実装する処理ではないかもしれませんが例えば、です)、みたいな処理が考えられますね。
ですが、下記のようなコードではイベントが発生しません。
Post::where('id', '<', 10)
->delete();
}
この挙動については Laravel のドキュメントにも記載ありました。
https://laravel.com/docs/8.x/eloquent#events
When issuing a mass update or delete query via Eloquent, the saved, updated, deleting, and deleted model events will not be dispatched for the affected models. This is because the models are never actually retrieved when performing mass updates or deletes.
Eloquentを介しての大量の更新処理、削除処理に対してモデルイベントは発生しません・・・、ということですね。
解決策としては、
1つひとつ削除するか、
Post::where('id', '<', 10)
->get()
->each(function($item) {
$item->delete();
});
}
destory()メソッドを使用します。
$ids = Post::where('id', '<', 10)
->get()
->pluck('id')
->toArray();
Post::destroy($ids);
}