gpt4 book ai didi

php - laravel 中的嵌套资源

转载 作者:行者123 更新时间:2023-12-04 03:16:46 25 4
gpt4 key购买 nike

我正在构建我的 API(品牌和型号)并且我想要嵌套资源(不确定这是否正确,平静地说)

/品牌/法拉利/车型/品牌/法拉利/模型/f40

我定义了如下路由

Route::resource('makes.models', 'ModelsController');

和 ModelsController.php

/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$data = Models::all();
return response()->json($data);
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$data = Models::find($id);
return response()->json($data);
}

和模型模型(是的,我需要更改名称)

class Models extends Model
{

public function make()
{
return $this->belongsTo('App\Make');
}
}

我的问题是,即使路线有效,它也会返回数据库中的所有模型(不仅是法拉利),我应该在哪里定义这种关系?是不是自动的?我有 2 个表 makes (id, name), models (id, name, make_id)

谢谢!

最佳答案

资源路由将定义以下路由:

Method  Path                               Action 
GET /makes/{make}/models index
GET /makes/{make}/models/create create
POST /makes/{make}/models store
GET /makes/{make}/models/{id} show
GET /makes/{make}/models/{id}/edit edit
PUT /makes/{make}/models/{id} update
DELETE /makes/{make}/models/{id} destroy

您的请求/makes/ferrari/models 将不匹配任何这些路线(因为您的 show 参数只采用一个参数)。您可能会请求/makes/models/1 来调用 show,但您实际上错过了为此的路由,因为嵌套路由不提供它。

如果您说您总是获得所有项目,那么您很可能会点击索引操作而不是显示。

如果你想用/makes/ferrari/models/f40 查询你的模型,你需要这样的路由:

Route::get('/makes/{make}/model/{model}', 'ModelsController@show');

这已经是为您创建的资源路线的一部分。现在,在您的显示 Controller 中,使用 make 和 model 参数找到正确的数据集:

public function show($make, $model)
{
$data = Model::with('makes')
->whereName($model)
->whereHas('makes', function ($query) use ($make) {
$query->where('name', '=', $make);
})->get();

return response()->json($data);
}

Laravel 不会自动为你做这些。

更新:路由模型绑定(bind)

您可能想查看 https://laravel.com/docs/5.3/routing#route-model-binding一个更复杂的方法来做到这一点。您可以在两个模型中设置您的路由键名称,覆盖 getRouteKeyName() 方法并在这种情况下返回“名称”,告诉 Laravel 使用名称列而不是 ID。

您还可以通过执行以下操作将路由中的参数专门绑定(bind)到自定义解析逻辑

$router->bind('model', function ($value) {
return Model::where('name', $value)->first();
});

然后每次您在路由中使用 {model} 时,它都会使用名称而不是 id。

使用鼻涕虫

但是,请注意,您必须绝对确保存储在数据库中的模型和制造商的名称已精简,以便它们适合在 URL 中使用。如有必要,您可以在绑定(bind)中执行此操作,如上所示,返回

return str_slug(Model::where('name', $value)->first());

然而,这是未经测试的,因此它可能有效也可能无效。

希望对您有所帮助:-)

关于php - laravel 中的嵌套资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40335052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com