1 回答
TA贡献1784条经验 获得超7个赞
是否有理由不能将单个唯一值(例如自动增量 ID)作为主键,然后将两个附加索引作为唯一复合索引?
这将解决您的路由参数问题,因为您只有一个主键:
/api/peopleDatas/{id}
您的迁移将包括唯一复合索引的规范:
$table->unique(['personel_id', 'valid_for_quarter']);
这样,您的组合列保持唯一性,而您的路线被简化为单个 ID,并且您的关系也可以使用单个 ID。这将提高性能并简化代码。
或者,如果您绝对必须有一个复合主键,您可以这样做。您的迁移需要:
$table->primary(['personel_id', 'valid_for_quarter']);
您的模型需要为保存查询设置键(请参阅链接) https://blog.maqe.com/solved-eloquent-doesnt-support-composite-primary-keys-62b740120f
protected function setKeysForSaveQuery(Builder $query)
{
$query
->where('personel_id', '=', $this->getAttribute('personel_id'))
->where('valid_for_quarter', '=', $this->getAttribute('valid_for_quarter'));
return $query;
}
路由绑定的最佳解决方案是使用显式路由模型绑定(请参阅文档链接),您的参数是两个键的分隔组合:
/api/peopleDatas/{people_data}人员数据 =1_3例如
https://laravel.com/docs/5.8/routing#explicit-binding
在您的路线服务提供商中,您需要指定解析逻辑,如下所示:
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);
});
}
- 1 回答
- 0 关注
- 156 浏览
添加回答
举报