Php 如何为具有组合主键的表创建CRUDAPI

Php 如何为具有组合主键的表创建CRUDAPI,php,laravel,eloquent,crud,Php,Laravel,Eloquent,Crud,我有一个Laravel应用程序来提供CRUDAPI。有一个包含compose主键的表,我在模型和迁移文件中介绍了这些键: protected $primaryKey = ['personel_id', 'valid_for_quarter']; 我也这样定义了它的路线: Route::middleware('auth:api')->group( function () { Route::apiResources([ 'peopleDatas' => 'API\People

我有一个Laravel应用程序来提供CRUDAPI。有一个包含compose主键的表,我在模型和迁移文件中介绍了这些键:

protected $primaryKey = ['personel_id', 'valid_for_quarter'];
我也这样定义了它的路线:

Route::middleware('auth:api')->group( function () {
 Route::apiResources([
    'peopleDatas' => 'API\PeopleDataController'
 ]);
});
public function show(PeopleData $peopleData)
{
    dd($peopleData);
}  
以及包含如下方法的
show
方法的控制器类:

Route::middleware('auth:api')->group( function () {
 Route::apiResources([
    'peopleDatas' => 'API\PeopleDataController'
 ]);
});
public function show(PeopleData $peopleData)
{
    dd($peopleData);
}  
现在的问题是:

1。在这种情况下,当对象有多个主键时,访问show方法的url是什么? 请注意,我没有自己明确定义路由url,我想使用
route::apiResources
方法。可能吗

以下是路线列表:

|        | GET|HEAD  | api/peopleDatas                         | peopleDatas.index                 | App\Http\Controllers\API\PeopleDataController@index                       | api,auth:api |
|        | POST      | api/peopleDatas                         | peopleDatas.store                 | App\Http\Controllers\API\PeopleDataController@store                       | api,auth:api |
|        | GET|HEAD  | api/peopleDatas/{peopleData}            | peopleDatas.show                  | App\Http\Controllers\API\PeopleDataController@show                        | api,auth:api |
|        | DELETE    | api/peopleDatas/{peopleData}            | peopleDatas.destroy               | App\Http\Controllers\API\PeopleDataController@destroy                     | api,auth:api |
|        | PUT|PATCH | api/peopleDatas/{peopleData}            | peopleDatas.update                | App\Http\Controllers\API\PeopleDataController@update                      | api,auth:api |
另一方面,在这种情况下,我应该显式地定义URL吗?例如,
/api/peopleDatas/{key1}/{key2}
或者Laravel是否有适用于它的标准方法

2.如果对象有多个主键,则
会有说服力
,可以处理它并从数据库中获取项目,或者我需要从用户处获取ID并在我的模型上应用
查找
功能


3.如果默认情况下它不由Laravel自己处理,是否可以覆盖一些函数,以告知Laravel在
路由模型绑定的情况下如何从DB获取项目

有什么原因不能将单个唯一值(如自动递增ID)作为主键,然后将两个附加索引作为唯一的复合索引

这将解决路由参数问题,因为您只有一个主键:

/api/peopleDatas/{id}

您的迁移将包括指定唯一的复合索引:

$table->unique(['personel_id', 'valid_for_quarter']);
这样,您的组合列保持唯一性,而您的路由简化为单个ID,并且您的关系也可以使用单个ID。这将提高性能并简化代码

或者,如果您绝对必须具有复合主键,则可以这样做。您的迁移需要:

$table->primary(['personel_id', 'valid_for_quarter']);
您的模型需要为保存查询设置键(请参见链接)

路由绑定的最佳解决方案是使用显式路由模型绑定(请参阅链接到文档),参数是两个键的分隔组合:

/api/peopleDatas/{people_data}
其中people data=
1_3
例如

在路由服务提供商中,您需要指定解析逻辑,该逻辑类似于:

public function boot()
{
    parent::boot();

    Route::bind('people_data', function ($value) {
        return App\PeopleData::where('personal_id', explode('_', $value)[0])
            ->where('valid_for_quarter',  explode('_', $value)[1])
            ->first() ?? abort(404);
    });
}