shiftonelabs/laravel-cascade-deletes
Strengths:
ON DELETE CASCADE) are unavailable (e.g., soft deletes, polymorphic relationships, or schema-less setups).SoftDeletes, enabling cascading for "logical" deletes.morphTo, morphMany) where foreign keys are dynamic.Weaknesses:
| Risk Area | Severity | Mitigation Strategy |
|---|---|---|
| Partial cascades | High | Wrap cascading logic in transactions. |
| Performance bottlenecks | Medium | Use with() or load() to eager-load relationships before deletion. |
| Circular dependencies | Medium | Implement pre-delete validation (e.g., custom observer). |
| Soft delete conflicts | Low | Test thoroughly with SoftDeletes enabled. |
| Laravel version drift | Low | Pin package version in composer.json. |
Referential Integrity Strategy:
Error Handling:
Testing:
Long-Term Maintenance:
Alternatives:
ON DELETE CASCADE in migrations).Assessment Phase:
delete() calls in the codebase to identify implicit vs. explicit deletes.User → Posts → Comments).Pilot Implementation:
Tag or Category).$cascadeDeletes = ['posts', 'comments']) to avoid global side effects.Gradual Rollout:
Post::find($id)->delete()) with package usage.MorphTo with null foreign keys).Optimization:
with()) before deletes to reduce queries.DB::transaction(function () {
$user->delete(); // Triggers cascades
});
| Component | Compatibility Notes |
|---|---|
| Laravel 9–11.x | Fully supported; test edge cases with new query builder features. |
| SoftDeletes | Works, but clarify whether soft-deleted parents should trigger cascades. |
| Polymorphic Relations | Supported, but validate dynamic foreign keys. |
| Observers/Events | May conflict; prioritize package over custom observers for deletes. |
| Queued Jobs | Cascades execute synchronously; consider queueing for long-running deletes. |
| Database Drivers | Test with primary DB (e.g., MySQL/PostgreSQL); SQLite may have edge cases. |
config/cascade-deletes.php (if using global defaults).$cascadeDeletes to models or use global rules.class User extends Model {
protected $cascadeDeletes = ['posts', 'comments'];
}
dd($this->getCascadeDeletes()) to inspect rules at runtime.laravel.log for exceptions during cascades.$cascadeDeletes property.$user->delete(); // Sync
// OR
User::find($id)->delete(); // Async via queue
delete query duration in Laravel Telescope or New Relic.| Scenario | Impact | Mitigation |
|---|
How can I help you explore Laravel packages today?