Как отфильтровать товары по категории?

Для фильтрации товаров по категории в 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

Теперь, при выборе категории из списка или отправке формы, товары будут отображаться только для выбранной категории.