URL 的传递变量到 Laravel 的方法

Transmission variable of URL to the method in Laravel

) 我有方法:

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'));
}

此方法 return 生成了所选类别中的产品列表。编号 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 return编辑:

Undefined variable: categories

这种方式也不行:

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 无所不能return。所选类别中的产品列表为空。

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');

型号category.php:

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

型号product.php:

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

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

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

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

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

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'));
}

根据你给我看的所有测试,我想我已经知道了。 $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 声明将类别置于匿名函数的范围内

好的,我修复了这个问题。现在可以使用了 ;)

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'));
}