- How do I restrict a polymorphic relationship to only accept specific model types in Laravel?
- Use the `constrainedMorphTo` method from this package, passing an array of allowed classes (e.g., `[Post::class, Video::class]`). This replaces the standard `morphTo` and enforces type constraints at runtime, returning `null` for invalid types.
- Does this package work with Laravel 11 or 12? What about older versions?
- The package officially supports Laravel 10.48+, 11.x, and 12.x. Laravel 13 is supported in version 1.2.0+. Older versions may work but aren’t guaranteed due to breaking changes in Eloquent’s polymorphic handling.
- Will existing `morphTo` relationships break if I switch to `constrainedMorphTo`?
- No, existing `morphTo` relationships remain unchanged. The package only adds constraints when explicitly used. However, unconstrained relationships will still accept any model type, so you’ll need to migrate them intentionally.
- Can I use custom column names (not `model_type`/`model_id`) for constrained polymorphic relationships?
- Yes, you can specify custom column names as the second and third arguments to `constrainedMorphTo` (e.g., `constrainedMorphTo([Post::class], 'custom_type', 'custom_id')`). This is useful for legacy schemas or non-standard polymorphic setups.
- How does this package handle invalid model types during runtime? Does it throw exceptions?
- The package returns `null` for invalid model types instead of throwing exceptions. You’ll need to handle this in your business logic, such as logging the issue or providing fallback behavior (e.g., redirecting to a default model).
- Is there a performance impact when using constrained polymorphic relationships in high-traffic APIs?
- The performance impact is minimal for most use cases, as constraints are enforced via `instanceof` or class comparison during query resolution. However, for critical API endpoints with frequent polymorphic filters, benchmarking is recommended to ensure no bottlenecks.
- Does this package support Laravel’s `morphMap` for custom model name mappings?
- Yes, the package aligns with Laravel’s `morphMap` and supports custom model name mappings. For example, if you’ve mapped `Post::class` to `'posts'`, the constraints will respect this mapping during type validation.
- How do I test constrained polymorphic relationships in PHPUnit?
- Test by asserting the returned model type matches the allowed constraints. For example, use `assertInstanceOf(Post::class, $comment->commentable())` for single-type constraints or `assertInstanceOf(Post::class | Video::class, $comment->commentable())` for multi-type constraints. Mock invalid types to verify `null` is returned.
- Are there any known conflicts with other Laravel packages like `spatie/laravel-activitylog` or `laravel-nova`?
- Potential conflicts may arise if third-party packages modify polymorphic behavior globally (e.g., via scopes or macros). Test thoroughly in your environment, especially if using packages that alter `morphTo` logic or add custom query constraints.
- What’s the best way to handle legacy polymorphic data that might contain invalid types after enabling constraints?
- Run data migrations or validation layers to clean up invalid records before enforcing constraints. Alternatively, use a hybrid approach where constraints are optional for specific relationships until legacy data is resolved. Log invalid types for manual review if needed.