Laravel 资源控制器

如何让我的 API 显示基于另一列的特定结果?

例如localhost:8000/api/gadgets/{{id}}

通常它返回带有该 ID 的特定小工具的特定信息,而 localhost:8000/api/gadgets/{{imei_code}} 不返回任何值或错误,而 imei_code 是我需要作为一个列传递GET 请求...

我使用的是普通资源控制器

public function show(Gadgets $gadget)
{
    $response = ['data' => new GadgetResource($gadget),'message' => 'specific gadget'];

    return response($response,200);  
}

另外,我需要关于如何在控制器中创建类似搜索功能的帮助。

x4701481 回答:Laravel 资源控制器

你不能做两个相似的 URL。我认为您的网址路线

localhost:8000/api/gadgets/{{imei_code}}

不起作用。此外,路由的顺序也很重要,首先定义的路由将比第二个定义的路由具有更高的优先级。 因为你的路由 /api/gadgets/{{id}} 和 /api/gadgets/{{imei_code}} 在这种情况下是相似的,所以只会处理前面描述的那个。

您可以定义另一个路由器和处理程序,例如:

本地主机:8000/api/gadgets

默认情况下,这将返回小工具列表,您可以为 imei_code 添加过滤器。例如:

localhost:8000/api/gadgets?imei_code=123

你的新路由的处理程序可能会写成这样:

public function showList(Request $request): GadgetResource
{
    if ($imeiCode = $request->query('imei_code')) {
        $list = Gadget::query()->where('imei_code',$imeiCode)->get();
    } else {
        $list = Gadget::query()->take(10)->get();
    }

    return GadgetResource::collection($list);
}

或者像替代解决方案一样,您可以通过imei_code创建不同的路径来搜索小工具,以消除任何路径冲突

本地主机:8000/api/gadgets/by_imei/123

public function findByImei(Request $request): GadgetResource
{
    $imeiCode = $request->route('imei_code');
    $item = Gadget::query()->where('imei_code',$imeiCode)->first();

    return new GadgetResource($item);
}

,

尝试改变响应

public function show(Gadgets $gadget)
{
    $response = ['data' => new GadgetResource($gadget),'message' => 'specific gadget'];
    return response()->json($response);  
}
,

您可以通过范围指定模型键 - 检查 docs

Route::resource('gadgets',GadgetController::class)->scoped([
    'gadget' => 'imei_code'
]);

然后,当 Laravel 尝试在 Controller 中绑定 Gadget 模型时 - 模型将通过键 imei_code 进行搜索。

这段代码相当于

Route::get('/gadget/{gadget:imei_code}');

本文链接:https://www.f2er.com/1228.html

大家都在问