在我的 Laravel 应用程序中,我有模型
Organization
、Region
和 Location
,它们都通过 User
模型与 Assignment
模型具有多态关系。 (Assignment
是 User
、Role
和其他三个实体之一之间的三向关系,但这与此处的问题并不严格相关。)
我想向其他三个模型的每个控制器添加一个
showUsers
方法,以获取与该实体关联的所有用户。为了避免在所有三个控制器中复制粘贴相同的代码,我创建了一个像这样的 trait
:
use App\Http\Resources\UserSimpleWithRoleResource;
use App\Models\Assignment;
use Illuminate\Database\Eloquent\Model;
trait GetsRelatedUsers
{
function listUsers(Model $model)
{
// Thanks to explicit model binding,
// `$model` can be any supported model.
$assignments = Assignment::with(['user:id,given_name,surname', 'role:id,name,display_order'])
->has('user') // prevents assignments for soft-deleted users from showing up
->atPlace($model) // a scope that also adds other conditions based on the provided model
->get();
return UserSimpleWithRoleResource::collection($assignments);
}
}
为了解析路由中的
Model $model
值,我需要在 RouteServiceProvider
的 boot
方法中具有显式模型绑定,如下所示:
Route::model('location', Location::class);
Route::model('region', Region::class);
Route::model('organization', Organization::class);
在我的路线文件中,我设置了
Organization
、Region
和 Location
的三个控制器,以允许查看和编辑软删除模型,如下所示:
Route::apiResource('organizations', \App\Http\Api\Organizations\Controller::class)->withTrashed(['show', 'update']);
Route::apiResource('regions', \App\Http\Api\Regions\Controller::class)->withTrashed(['show', 'update']);
Route::apiResource('locations', \App\Http\Api\Locations\Controller::class)->withTrashed(['show', 'update']);
在添加显式模型绑定之前,内置隐式模型绑定将检查路径是否存在
withTrashed
选项,并更改模型解析器以包含已废弃的项目。但是,显式绑定不会执行此检查。
除了在我的显式模型绑定中完全重新实现对
$route->allowsTrashedBindings()
的检查之外,是否有一种很好的方法来实现这一点,以便某些路由可以包含垃圾项目,而其他路由则不能?
我认为你可以在 RouteServiceProvider 中这样做
Route::bind('location', function ($value) {
return Location::withTrashed()->where('id', $value)->firstOrFail();
});
请参阅此处:https://github.com/laravel/framework/issues/43008#issuecomment-1170673827