首页 > 解决方案 > 与“显示”功能不一致

问题描述

我已经在一个项目上工作了几个月,我觉得我发现公共功能秀的运作方式有些不一致

我有一个Location的模型和控制器

public function show(Location $Location)
{
    $Loc = Location::with('company:id,name')->findOrFail($Location); 
    return response()->json($Loc,200);
}

这很好用。注意参数。

我刚刚为Asset制作了一个新模型和控制器,它有:

public function show(Asset $asset)
{ 
    $AssetReturn = Asset::with('location:id,name,address')->findOrFail($asset);
    return response()->json($AssetReturn,200);
}

但这不起作用。它只是返回空。如果我从参数中删除类名,那么它只是

public function show($asset)

然后它按预期工作。

资产模型与位置的关系:

public function location()
    {
        return $this->belongsTo(Location::class);
    }

标签: laravel

解决方案


根据文档,Laravel 自动解析定义在路由或控制器操作中的 Eloquent 模型,其类型提示的变量名称与路由段名称匹配。例如:

Route::get('/assets/{asset}', function (App\Asset $asset) {
    $asset->load('location:id,name,address');
    return response()->json($asset);
});

由于$asset变量被类型提示为App\AssetEloquent 模型,并且变量名称与{asset}URI 段匹配,Laravel 将自动注入 ID 与请求 URI 中相应值匹配的模型实例。如果在数据库中没有找到匹配的模型实例,将自动生成 404 HTTP 响应。

如果您不想要这种行为并想findOrFail手动使用:

Route::get('/assets/{asset}', function ($assetId) {
    $asset = App\Asset::with('location:id,name,address')->findOrFail($assetId);
    return response()->json($asset);
});

推荐阅读