Уроки курса
1 Основы синтаксиса PHP 8
60 мин
2 Функции и управляющие конструкции
60 мин
3 Объектно-ориентированное программирование на PHP
60 мин
4 Наследование, интерфейсы и полиморфизм
60 мин
5 Основы баз данных MySQL и работа через PDO
60 мин
6 Архитектурный паттерн MVC
60 мин
7 Введение в Laravel и настройка окружения
60 мин
8 Маршрутизация и контроллеры в Laravel
60 мин
9 Шаблонизатор Blade и создание интерфейса
60 мин
10 Миграции баз данных и Eloquent ORM
60 мин
11 Связи моделей в Eloquent — Настройка связей 'один …
60 мин
12 Аутентификация и защита маршрутов
60 мин
13 Разработка каталога товаров и категорий
60 мин
14 Реализация корзины покупок через сессии
60 мин
15 Оформление заказа и транзакции базы данных
60 мин
16 Интеграция платежной системы Stripe
60 мин
17 Интеграция платежной системы Vipps
60 мин
18 Разработка панели администратора
60 мин
19 Оптимизация и подготовка к production
60 мин
20 Деплой Laravel-приложения на сервер
60 мин
21 Основы PHP 8: Синтаксис, переменные и управляющие конструкции
60 мин
22 Функции и массивы в PHP 8
60 мин
23 Объектно-ориентированное программирование: Классы и объекты
60 мин
24 Продвинутое ООП: Наследование, интерфейсы и полиморфизм
60 мин
25 Основы баз данных: Проектирование БД и работа с …
60 мин
26 Взаимодействие PHP с MySQL через PDO
60 мин
27 Архитектура MVC и введение в фреймворк Laravel
60 мин
28 Маршрутизация и контроллеры в Laravel
60 мин
29 Шаблонизатор Blade: Создание пользовательского интерфейса
60 мин
30 Миграции и Eloquent ORM: Создание таблиц товаров
60 мин
31 Связи в Eloquent ORM: Отношения между моделями
60 мин
32 Аутентификация и авторизация пользователей
60 мин
33 Разработка каталога товаров: Вывод, фильтрация и пагинация
60 мин
34 Реализация корзины покупок с использованием сессий
60 мин
35 Оформление заказа: Работа с формами и валидация
60 мин
36 Транзакции базы данных: Сохранение заказа
60 мин
37 Интеграция платежной системы Stripe
60 мин
38 Интеграция платежной системы Vipps
60 мин
39 Создание панели администратора
60 мин
40 Подготовка к production и деплой приложения
60 мин
41 Основы PHP 8 и синтаксис
60 мин
42 Объектно-ориентированное программирование на PHP
60 мин
43 Продвинутое ООП и интерфейсы
60 мин
44 Основы баз данных и MySQL
60 мин
45 Архитектурный паттерн MVC
60 мин
46 Введение в Laravel и маршрутизация
60 мин
47 Шаблонизатор Blade и верстка интерфейса
60 мин
48 Миграции и структура базы данных
60 мин
49 Eloquent ORM и модели
60 мин
50 Отношения в Eloquent ORM
60 мин
51 Авторизация и защита маршрутов
60 мин
52 Создание каталога товаров
60 мин
53 Реализация корзины покупок
60 мин
54 Оформление заказа и транзакции БД
60 мин
55 Интеграция платежной системы Stripe
60 мин
56 Интеграция платежной системы Vipps
60 мин
57 Панель администратора: управление товарами
60 мин
58 Панель администратора: управление заказами
60 мин
59 Подготовка к production и деплой
60 мин
60 Запуск и тестирование готового интернет-магазина
60 мин

Связи моделей в Eloquent — Настройка связей 'один ко многим' и 'многие ко многим' между категориями, товарами и заказами

Изучение реляционных связей в Laravel Eloquent ORM. Мы настроим взаимодействия между моделями Category, Product, Order и OrderItem, применяя методологию Direct Instruction для глубокого понимания архитектуры базы данных.

Прогресс урока: 0%

Добро пожаловать в одиннадцатый урок нашего курса по созданию интернет-магазина. Сегодня мы переходим к одной из самых мощных возможностей фреймворка Laravel — системе реляционных связей Eloquent ORM. В рамках методологии Direct Instruction мы последовательно разберем, как таблицы в базе данных общаются друг с другом через модели PHP. В реальном интернет-магазине данные никогда не существуют изолированно. Товар всегда принадлежит какой-то категории, а заказ состоит из множества товаров. Для реализации такой логики используются связи 'Один ко многим' (One-to-Many) и 'Многие ко многим' (Many-to-Many). Eloquent позволяет нам работать с этими связями как с обычными свойствами объектов, скрывая под капотом сложные SQL-запросы с операторами JOIN. Это значительно ускоряет разработку и делает код более читаемым. Важно понимать: прежде чем настраивать связи в моделях, ваши миграции должны быть корректно настроены с использованием внешних ключей (foreign keys), таких как category_id в таблице products.

php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Category extends Model
{
    protected $fillable = ['name', 'slug'];

    // Связь 'Один ко многим': Одна категория имеет много товаров
    public function products(): HasMany
    {
        return $this->hasMany(Product::class);
    }
}

В приведенном выше коде мы определили связь в модели Category. Метод products() возвращает объект отношения HasMany. Обратите внимание на типизацию возвращаемого значения — это хорошая практика в PHP 8. Теперь, если у нас есть объект категории, мы можем получить все её товары, просто обратившись к свойству: $category->products. Laravel автоматически выполнит SQL-запрос вида SELECT * FROM products WHERE category_id = ?. Типичная ошибка новичков — вызов метода со скобками $category->products() вместо свойства. Если вы используете скобки, вы получаете объект построителя запросов (Query Builder), к которому можно добавить дополнительные условия (например, $category->products()->where('price', '>', 100)->get()). Если же вы обращаетесь как к свойству, вы получаете готовую коллекцию (Collection) моделей Product.

php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Product extends Model
{
    protected $fillable = ['category_id', 'name', 'description', 'price'];

    // Обратная связь: Товар принадлежит одной категории
    public function category(): BelongsTo
    {
        return $this->belongsTo(Category::class);
    }
}

Для полноценной работы связи необходимо настроить её с обеих сторон. В модели Product мы используем метод belongsTo. Это означает, что в таблице products есть столбец category_id, который ссылается на id в таблице categories. Теперь мы можем сделать так: $product->category->name, чтобы вывести название категории конкретного товара. Применяя принцип Chunking, мы разбиваем сложную тему на части. Мы только что освоили 'Один ко многим'. Теперь поговорим о заказах. Заказ (Order) содержит множество товаров, но и один и тот же товар может быть в разных заказах. Это связь 'Многие ко многим' (Many-to-Many). Однако в e-commerce мы обычно используем промежуточную модель OrderItem (позиция заказа), которая хранит не только связи, но и цену на момент покупки, а также количество. Поэтому мы сводим это к двум связям 'Один ко многим': Order имеет много OrderItem, а OrderItem принадлежит Order и Product.

Какой метод Eloquent используется в модели Product для указания того, что товар принадлежит определенной категории?

Практическое задание: Настройка связей

В рамках нашего проекта (Project-Based Learning) реализуйте связи между моделями.

  • Откройте файл app/Models/Category.php и добавьте метод products() с использованием hasMany.
  • Откройте файл app/Models/Product.php и добавьте метод category() с использованием belongsTo.
  • Создайте модель OrderItem (php artisan make:model OrderItem).
  • В модели Order добавьте связь items(), возвращающую hasMany(OrderItem::class).
10 баллов