在 Laravel 路由中使用多列解析模型

问题描述 投票:0回答:2

我正在尝试注册一个路由来根据多列自动获取单个模型。例如:

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
的组合是唯一的。

laravel eloquent url-routing
2个回答
0
投票

你可以这样定义路线,

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(无论您的情况如何)在所有这三个地方都必须相同


0
投票

注意:在上面的问题陈述中,我假设有一个名为 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 导入模型;

谢谢你。

© www.soinside.com 2019 - 2024. All rights reserved.