[英]Laravel apiResource to fetch record by field other than id
我正在使用 Laravel 從我創建了 apiResource controller 的數據庫中獲取記錄。 我在路由中設置了以下代碼。
Route::apiResource('/MyController',MyController::class)->middleware('auth:api');
在 MyController.php 我顯示特定數據的代碼是:
/**
* Display the specified resource.
*
* @param \App\Models\ContentType $contentType
* @return \Illuminate\Http\Response
*/
public function show(MyModel $Model)
{
// show content type info
return response([
'data' => new MyControllerResource($Model)
],200);
}
當我像這樣進行 api 調用時,我得到了數據:
http://localhost:8000/api/MyController/1
我想要的是通過在路由中傳遞其他字段值而不是 id 來獲取記錄。 例如。
http://localhost:8000/api/MyController/mypost
知道如何實現這一目標嗎?
您正在使用路由 model 綁定。 而在 laravel 中,它的默認行為是查找具有id
和返回集合的 model。 它不會搜索任何其他字段。 當然,您可以更改此行為,但它只能按一個字段搜索數據。 要更改此行為,請使用 model 中的getRouteKeyName
方法,例如:
public function getRouteKeyName()
{
return 'another_field_in_my_table';
}
您還可以使用顯式綁定,例如:
Route::bind('MyController', function($value) {
return \App\MyModel::where('id', $value)->orWhere('another_field_in_my_table', $value)->first();
});
要了解有關顯式綁定檢查文檔的更多信息。
所有模型的路由鍵名稱默認為id
。 您將希望通過添加getRouteKeyName()
方法將其更新為name
或任何字段“mypost”。
<?php
namespace App;
...
class Post extends Model
{
public function getRouteKeyName()
{
return 'name';
}
...
}
您必須單獨定義路線。 您可以按 controller 和中間件對路由進行分組。 完成后,在您的路線內,您需要更改為:
Route::get('/show/{post:columnName}', [ MyController::class, 'show' ])->middleware('auth:api');
現在,您的數據將根據您在路線中定義的列名來獲取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.