【问题标题】:Transmission variable of URL to the method in LaravelLaravel 中方法的 URL 传输变量
【发布时间】:2016-11-05 13:32:21
【问题描述】:

) 我有方法:

public function show($id){
$categories = Category::findOrFail($id);
$productsList = Category::with(['products' => function ($query) {
                  $query->where(['category_id', 19]);
              }])->get();
return view('categories.showcategory', compact('categories', 'productsList'));
}

此方法返回所选类别中的产品列表。编号 19 是选定的 ID 类别。所选类别中产品列表的 URL 如下所示:www.[...]magazyn_michal/public/addcategory/19 问题是:如何传递动态值数字方法的 URL 的 ID 类别 (19) ?? 我试试这个(但不起作用):

public function show($id){
$categories = Category::findOrFail($id);
$productsList = Category::with(['products' => function ($query) {
                  $query->where(['category_id' => $categories->id]);
              }])->get();
return view('categories.showcategory', compact('categories', 'productsList'));
}

Laravel 返回:

未定义变量:类别

这种方式也行不通:

public function show($id){
$categories = Category::findOrFail($id);
$productsList = Category::with(['products' => function ($query) {
                  $query->where('category_id', Input::get('category_id'));
              }])->get();
return view('categories.showcategory', compact('categories', 'productsList'));
}

Laravel 什么都不会返回。所选类别中的产品列表为空。

routes.php 文件:

Route::get('/', 'ProductsController@index');
Route::get('/contact', 'PagesController@contact');
Route::resource('/addarticle', 'ArticlesController');
Route::resource('/addcategory', 'CategoriesController');
Route::resource('/listcategory', 'CategoriesController@listCategory');
Route::resource('/warehouse', 'ProductsController');
Route::auth();
Route::get('/home', 'HomeController@index');

模型类别.php:

public function products(){
    return $this->hasMany('App\Product');
}

model product.php:

public function category(){
    return $this->belongsTo('App\Category');
}

我用这个:https://laravel.com/docs/5.2/eloquent-relationships#constraining-eager-loads

【问题讨论】:

  • 您需要发布您的路线,以便我们看到它是如何设置的
  • @Rob Fonseca 我更新我的帖子
  • 您的控制器中是否有 dd($categories) 以确保它实际上是从数据库中拉出一个?您的路线、方法定义和将类别从模型中拉出似乎没有任何问题,因此要确保您实际上首先获得了类别。
  • @RobFonseca $categories = Category::findOrFail($id); dd($categories); 回复了这个:link

标签: php laravel url methods transmission


【解决方案1】:

好的,我修复了这个问题。现在它正在工作;)

public function show($id){
$categories = Category::findOrFail($id);
$categoryID = Input::get('category_id');
$productsList = Category::with(['products' => function ($query) use($id) {
                  $query->where('category_id', '='  ,$id);
              }])->get();
return view('categories.showcategory', compact('categories', 'productsList'));
}

【讨论】:

    【解决方案2】:

    根据您向我展示的所有测试,我想我已经掌握了。 $categories 超出了您的查询范围。试试这个:

    public function show($id){
    $categories = Category::findOrFail($id);
    $productsList = Category::with(['products' => function ($query) use ($categories) {
                      $query->where('category_id', $categories->id)
                  }])->get();
    return view('categories.showcategory', compact('categories', 'productsList'));
    }
    

    use 声明将类别置于匿名函数的范围内

    【讨论】:

      【解决方案3】:

      在这种情况下,您应该使用路由模型绑定。您可以让您的路线 /categories/19 返回 Category 对象,而不仅仅是一个 ID。这可能已经发生,当您调用findOrFail 时会导致错误。

      查看:https://laravel.com/docs/master/routing#route-model-binding

      你还应该使用 Laravel 关系,所以你可以把这个函数放在你的 Category 类中:

      public function products(){
        return $this->belongsToMany('App\Product');
      }
      

      更多关于人际关系的阅读:https://laravel.com/docs/master/eloquent-relationships

      如果您同时执行这两项操作,您的控制器方法将如下所示:

      public function show(Category $category){
        $products = $category->products;
        return view('categories.showcategory', compact('category', 'products'));
      }
      

      【讨论】:

      • 您不需要使用子查询来定位产品。该关系会自动查找具有正确category_id 的产品,因此您只需执行$productList = $category->products;。另外,请查看路由模型绑定的文档,“显式绑定”部分是获取Category对象而不是ID所需的部分。
      猜你喜欢
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多