Переменная передачи URL для метода в 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'));
}

Этот метод возвращает список товаров в выбранной категории. Номер 19 выбран ID категории. URL-адрес списка продуктов в выбранной категории выглядит следующим образом: www. […] magazyn_michal / public / addcategory /19 Вопрос в том: Как я могу передать динамическое значение числовой идентификатор категории (19) URL-адреса в метод ?? Я пытаюсь это (но не работает):

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

Ларавел вернулся:

Неопределенная переменная: категории

Этот способ также не работает:

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

Ларавел ничего не возвращает. Пустой список товаров в выбранной категории.

Файл rout.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

0

Решение

В этой ситуации вы должны использовать привязку модели маршрута. Вы можете иметь свой маршрут /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'));
}
1

Другие решения

Я думаю, что у меня это основано на всех тестах, которые вы мне показали. $ category выходит за рамки вашего запроса. Попробуй это:

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

Объявление использования помещает категории в область действия вашей анонимной функции

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'));
}
0
По вопросам рекламы [email protected]