如何让我的 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);
}
另外,我需要关于如何在控制器中创建类似搜索功能的帮助。
答案 0 :(得分:1)
你不能做两个相似的 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);
}
答案 1 :(得分:0)
尝试改变响应
public function show(Gadgets $gadget)
{
$response = ['data' => new GadgetResource($gadget), 'message' => 'specific gadget'];
return response()->json($response);
}
答案 2 :(得分:0)
您可以通过范围指定模型键 - 检查 docs
Route::resource('gadgets', GadgetController::class)->scoped([
'gadget' => 'imei_code'
]);
然后,当 Laravel 尝试在 Controller 中绑定 Gadget 模型时 - 模型将通过键 imei_code
进行搜索。
这段代码相当于
Route::get('/gadget/{gadget:imei_code}');