簡體   English   中英

Laravel apiResource 按字段而不是 id 獲取記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM