Как вывести товары с категориями на одной странице?

Для вывода товаров с их категориями на одной странице в Laravel, можно использовать отношения между моделями и выполнить запрос с использованием метода with().

Предположим, у нас есть модели Product и Category, и между ними существует связь «один ко многим», где одна категория может иметь много товаров, а каждый товар относится только к одной категории.

1. Сначала, убедитесь, что у вас есть миграции для обеих моделей и примените их:

php artisan make:migration create_products_table --create=products
php artisan make:migration create_categories_table --create=categories

2. Определите отношения в моделях. В модели Product установите отношение belongsTo() к модели Category, а в модели Category установите отношение hasMany() к модели Product:

// app/Models/Product.php
namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Product extends Model
{
    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}

// app/Models/Category.php
namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Category extends Model
{
    public function products()
    {
        return $this->hasMany(Product::class);
    }
}

3. Создайте маршрут и контроллер для отображения товаров с категориями. В маршрутах web.php, добавьте следующий маршрут:

Route::get('/products', [ProductController::class, 'index']);

Создайте контроллер ProductController с методом index() для обработки запроса и отображения товаров с категориями:

// app/Http/Controllers/ProductController.php
namespace AppHttpControllers;

use AppModelsProduct;

class ProductController extends Controller
{
    public function index()
    {
        $products = Product::with('category')->get();

        return view('products.index', compact('products'));
    }
}

4. Создайте шаблон для отображения товаров с категориями. В директории resources/views, создайте директорию products и файл шаблона index.blade.php:

<!-- resources/views/products/index.blade.php -->
@extends('layout')

@section('content')
    <h1>All Products</h1>

    <table>
        <thead>
            <tr>
                <th>Name</th>
                <th>Category</th>
            </tr>
        </thead>
        <tbody>
            @foreach ($products as $product)
                <tr>
                    <td>{{ $product->name }}</td>
                    <td>{{ $product->category->name }}</td>
                </tr>
            @endforeach
        </tbody>
    </table>
@endsection

5. Наконец, создайте макет layout.blade.php, который будет использоваться шаблоном index.blade.php. В директории resources/views, создайте файл layout.blade.php:

<!-- resources/views/layout.blade.php -->
<!DOCTYPE html>
<html>
<head>
    <title>@yield('title')</title>
    <style>
        table {
            border-collapse: collapse;
        }

        th, td {
            border: 1px solid black;
            padding: 8px;
        }
    </style>
</head>
<body>
    @yield('content')
</body>
</html>

Теперь, при переходе по /products, вы будете видеть список товаров соответствующих их категориям.

Обратите внимание, что в данном примере используется Eloquent ORM и шаблонизатор Blade в Laravel. Можно настроить представление на свое усмотрение, добавить пагинацию и т. д.