Прежде всего, прочитайте документы о взаимоотношениях Laravel:
https://laravel.com/docs/5.7/eloquent-relationships
Причина, по которой ваш текущий код не работает, заключается в том, что в вашем маршруте вы запрашиваете параметры:
Route::get('{Brand}/{Category}', 'ProductsController@index');
Но в вашем методе index () вашего ProductsController вы не включили эти параметры.
public function index(Request $request, Brand $brand, Category $category)
Вторая проблема в вашем коде заключается в том, что вы вообще не используете свои отношения. Ваш текущий контроллер только что сделал новый красноречивый запрос.
Пример получения всех продуктов для данной категории, используя метод, который вы определили в вашей модели категории:
public function index(Request $request, Brand $brand, Category $category)
{
$products = $category->products;
return view('products.index', compact('products'));
}
Пример расширения с указанным брендом:
public function index(Request $request, Brand $brand, Category $category)
{
$products = $category->products()->where('brand_id', $brand->id)->get();
return view('products.index', compact('products'));
}
UPDATE
Как отмечается в комментариях, параметры URL являются слагаемыми, а не идентификаторами, поэтому автоматическое связывание модели маршрута не будет работать. Обновленное решение со слизнями:
public function index(Request $request, $brand, $category)
{
$categoryModel = Category::where('slug', $category)->firstOrFail();
$brandModel = Brand::where('slug', $brand)->firstOrFail();
$products = $categoryModel->products()->where('brand_id', $brandModel->id)->get();
return view('products.index', compact('products'));
}
Дальнейшее улучшение вашего кода будет состоять в том, чтобы добавить область или вспомогательный метод, чтобы вы могли сделать что-то вроде Brand::FindBySlug($slug);