Уроки курса
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 ORM: Отношения между моделями

Студент настроит связи «один ко многим» и «многие ко многим» между категориями, товарами и заказами, используя возможности Eloquent.

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

Введение в связи базы данных и Eloquent ORM

В предыдущих уроках мы создали миграции и базовые модели для нашего интернет-магазина. Однако реальная сила реляционных баз данных (таких как MySQL) и ORM (Object-Relational Mapping) заключается в их способности связывать данные между собой. В архитектуре MVC модель отвечает за структуру данных, и именно в моделях мы описываем эти связи. Eloquent ORM — это реализация паттерна ActiveRecord в Laravel, позволяющая работать с таблицами базы данных как с объектами классов.

Представьте интернет-магазин: у нас есть Категории (Categories) и Товары (Products). Одна категория может содержать множество товаров — это классическая связь «Один ко многим» (One-to-Many). Eloquent позволяет нам описать эту связь всего одной строчкой кода, после чего мы сможем получать все товары категории простым обращением к свойству: $category->products. В этом уроке мы подробно разберем, как настраивать такие связи, как они работают под капотом и как избежать типичных ошибок новичков, таких как проблема N+1.

Реализация связи «Один ко многим»

Чтобы связать модели Category и Product, нам нужно определить методы внутри самих классов моделей. В Laravel для связи «Один ко многим» используются методы hasMany() (имеет много) и belongsTo() (принадлежит к). Важно понимать логику: таблица, которая содержит внешний ключ (в нашем случае это category_id в таблице products), всегда использует метод belongsTo. Таблица, на которую ссылаются, использует hasMany.

Типичная ошибка новичков: путаница в том, где какой метод применять. Запомните простое правило: если в миграции таблицы есть поле с суффиксом _id (например, category_id), то соответствующая модель ДОЛЖНА иметь метод с belongsTo. Давайте посмотрим, как это выглядит в коде на практике.

php
// App\Models\Category.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class Category extends Model {
    // Категория имеет много товаров
    public function products() {
        return $this->hasMany(Product::class);
    }
}

// App\Models\Product.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class Product extends Model {
    // Товар принадлежит одной категории
    public function category() {
        return $this->belongsTo(Category::class);
    }
}

Как Eloquent строит SQL-запросы

Когда вы вызываете $product->category, Laravel под капотом делает следующее: он берет значение поля category_id у текущего товара и выполняет SQL-запрос вида: SELECT * FROM categories WHERE id = ? LIMIT 1. Это происходит автоматически, благодаря строгим соглашениям Laravel (Conventions). Фреймворк сам догадывается, что внешний ключ называется category_id, потому что метод называется category, а первичный ключ в таблице категорий — id.

Если вы отступаете от стандартов именования (например, ваш внешний ключ называется cat_id), вы можете передать его вторым аргументом: $this->belongsTo(Category::class, 'cat_id'). Однако следование стандартам (Scaffolding) значительно ускоряет разработку и делает код чище. В нашем курсе мы строго следуем PSR-12 и соглашениям Laravel.

Какой метод Eloquent ORM нужно использовать в модели Product, если таблица products содержит поле category_id?

Связь «Многие ко многим» и сводные таблицы

Теперь рассмотрим более сложный случай: Заказы (Orders) и Товары (Products). Один заказ может содержать множество разных товаров, а один и тот же товар может присутствовать в сотнях разных заказов. Это классическая связь «Многие ко многим» (Many-to-Many). Реляционные базы данных не поддерживают такую связь напрямую. Для ее реализации требуется третья, промежуточная таблица, называемая сводной (pivot table).

В нашем архиве проекта указано, что мы используем таблицу order_items. Эта таблица содержит как минимум два поля: order_id и product_id, а также дополнительные данные, такие как quantity (количество) и price (цена на момент покупки). В Eloquent для такой связи используется метод belongsToMany(). Чтобы получить доступ к дополнительным полям сводной таблицы (например, количеству), необходимо использовать метод withPivot('quantity', 'price') при описании связи.

Как называется паттерн, который реализует Eloquent ORM, позволяя работать с таблицами БД как с объектами классов?

Настройка связей в проекте

Примените полученные знания для настройки моделей вашего интернет-магазина. Это критически важный шаг перед разработкой контроллеров.

  • Откройте модель App\Models\Category и добавьте метод products() с использованием hasMany.
  • Откройте модель App\Models\Product и добавьте метод category() с использованием belongsTo.
  • Убедитесь, что миграция таблицы products содержит поле category_id (как было указано в архивных упражнениях).
  • Запустите php artisan tinker и проверьте работу связей, создав тестовую категорию и товар.
10 баллов