我正在尝试注册一个路由来根据多列自动获取单个模型。例如:
Route:get( 'sample/{myModel:status}/{myModel:slug}', [ SomeController:class, 'show' );
让我们访问这个 URI:
www.example.com/sample/publish/this-is-a-slug
现在我期望在控制器中获得的是单个
myModel
实例,其中 status
列等于 publish
和 slug
列等于 this-is-a-slug
。这可能吗?
尝试注册上述路由会导致参考错误:
Route pattern "/sample/{myModel}/{myModel}" cannot reference variable name "myModel" more than once.
现在我可以删除模型名称并在控制器中执行查询,但我想知道是否可以使用超过 1 列将模型注入到控制器中。
slug
列不是唯一的,但 slug
和 status
的组合是唯一的。
你可以这样定义路线,
Route::get('sample/{model_by_status}/{slug}', [ SomeController:class, 'show'] );
然后你可以像这样在RouteServiceProvider.php的boot()方法中添加路由绑定,
Route::bind('model_by_status', function($value){
$slug = request()->route('slug');
return myModel::where([
'status' => $value,
'slug' => $slug,
])->firstOrFail();
});
在你的控制器方法中,你需要像这样声明 show 方法
public function show(myModel $model_by_status){
}
请注意,命名在这里很重要。 model_by_status(无论您的情况如何)在所有这三个地方都必须相同
注意:在上面的问题陈述中,我假设有一个名为 myModel 的模型,因此我使用相同的模型名称来进一步得出结论
在 Laravel 10 中, 最初,我们可以根据您的意愿在根路由 web.php 或任何其他路由中定义我们的路由
use App\Http\Controllers\SomeController;
Route::get('sample/{id}', [ SomeController:class, 'function_name'] );
我已经在我的web.php中编写了上面的代码,并记得导入SomeController,
之后,我们必须转到位于 app/Providers/RouteServiceProvider.php 内的 RouteServiceProvider.php
use App\Models\your_model_name; // please import your Model name
public function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request- >ip());
});
$this->routes(function () {
Route::middleware('api')
->prefix('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
});
Route::bind('id', function($val) {
return your_model_name::where('id', $val)
->orWhere('status', $val)//here 'status' refers to the column_name you can give your column_name
->orWhere('slug', $val)//here 'slug' refers to the column_name you can give your column_name
->get();
});
}
在上面,我们将我的表中唯一的“id”与“$val”绑定在一起,“$val”是作为参数传递的值,并且在函数内部返回 your_model_name 的模型,即上面问题陈述中的 myModel 并使用where 查询查找与之后作为参数传递的值匹配的列名,
在 SomeController 内的控制器中,我们只需编写为
use App\Models\your_model_name;
public function function_name(your_model_name $id){ //here we have to send the Model name that is myModel in above problem statement and $variable_name
return response()->json($id); //here we can return the response as javscript_object_notation by sending our $variable_name inside json()
}
在上面不要忘记从 use App\Models\your_model_name 导入模型;
谢谢你。