Для фильтрации товаров по категории в Laravel вам потребуется выполнить следующие шаги:
1. Создайте модель Category, в которой будет определена связь с моделью Product. Например:
namespace AppModels; use IlluminateDatabaseEloquentModel; class Category extends Model { public function products() { return $this->hasMany(Product::class); } }
2. Создайте модель Product, в которой будет определена обратная связь с моделью Category. Например:
namespace AppModels; use IlluminateDatabaseEloquentModel; class Product extends Model { public function category() { return $this->belongsTo(Category::class); } }
3. В контроллере, отвечающем за отображение товаров, получите список категорий и передайте его в представление. Например:
namespace AppHttpControllers; use AppModelsCategory; use IlluminateHttpRequest; class ProductController extends Controller { public function index() { $categories = Category::all(); return view('products.index', compact('categories')); } }
4. В представлении (например, products/index.blade.php) выведите список категорий и создайте форму для фильтрации по категории. Например:
<!-- Вывод списка категорий --> @foreach ($categories as $category) <a href="{{ route('products.index', ['category' => $category->id]) }}">{{ $category->name }}</a> @endforeach <!-- Форма для фильтрации --> <form method="GET" action="{{ route('products.index') }}"> <select name="category"> <option value="">Все категории</option> @foreach ($categories as $category) <option value="{{ $category->id }}">{{ $category->name }}</option> @endforeach </select> <button type="submit">Фильтровать</button> </form>
5. В контроллере, обработчике запроса для отображения товаров, добавьте логику для фильтрации по категории. Например:
namespace AppHttpControllers; use AppModelsCategory; use AppModelsProduct; use IlluminateHttpRequest; class ProductController extends Controller { public function index(Request $request) { $categoryId = $request->input('category'); // Получаем все товары с относящимися категориями или только товары определенной категории $products = Product::when($categoryId, function ($query, $categoryId) { return $query->where('category_id', $categoryId); })->get(); return view('products.index', compact('products')); } }
6. Обновите представление (products/index.blade.php) для отображения отфильтрованных товаров. Например:
<!-- Вывод товаров --> @foreach ($products as $product) <div>{{ $product->name }}</div> @endforeach
Теперь, при выборе категории из списка или отправке формы, товары будут отображаться только для выбранной категории.