Уроки курса
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

Создание таблиц через миграции и выполнение CRUD-операций с помощью моделей Laravel.

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

В традиционной разработке создание структуры базы данных (таблиц, столбцов, ключей) выполняется вручную через SQL-клиенты вроде phpMyAdmin. Проблема такого подхода в том, что при командной разработке или переносе проекта на сервер (деплое) очень легко забыть создать нужную таблицу. Laravel решает эту проблему с помощью Миграций. Миграции — это система контроля версий для вашей базы данных. Это PHP-классы, в которых вы описываете структуру таблиц с помощью специальных методов Schema Builder. Выполняя команду php artisan migrate, Laravel автоматически читает эти классы и генерирует SQL-запросы для создания таблиц в MySQL. Если вы ошиблись, можно выполнить откат (rollback).

Рассмотрим пример из нашего архива (упражнение 1.1). Нам нужно создать таблицу products. В файле миграции в методе up() мы описываем столбцы: $table->id() создает первичный ключ. $table->foreignId('category_id')->constrained()->cascadeOnDelete() создает внешний ключ, связывающий товар с категорией; при удалении категории все её товары также удалятся (каскадное удаление). $table->string('name') создает VARCHAR столбец. $table->decimal('price', 8, 2) идеален для денег (8 цифр всего, 2 после запятой). $table->timestamps() автоматически добавляет поля created_at и updated_at.

Создав таблицы, нам нужно с ними взаимодействовать. Для этого Laravel предоставляет Eloquent ORM (Object-Relational Mapping). Eloquent реализует паттерн ActiveRecord. Каждая таблица в базе данных имеет соответствующую 'Модель' (PHP-класс), которая используется для взаимодействия с этой таблицей. Модель позволяет извлекать, вставлять и обновлять информацию без написания сырых SQL-запросов. Если таблица называется products, модель должна называться Product. Чтобы получить все товары, мы пишем Product::all(). Чтобы найти товар по ID: Product::find(1). Если нужно выбросить ошибку 404 при отсутствии товара, используется метод Product::findOrFail(1).

Одно из главных преимуществ Eloquent — это удобная работа со Связями (Relationships). В реляционных БД таблицы связаны друг с другом. Категория имеет много товаров (Один-ко-многим). В Eloquent мы описываем эту связь прямо в классах моделей (упражнение 1.2 из архива). В модели Category создается метод products(), который возвращает $this->hasMany(Product::class). В модели Product создается метод category() с $this->belongsTo(Category::class). После этого мы можем получить категорию товара просто обратившись к свойству: $product->category->name. Eloquent сам сгенерирует и выполнит нужный SQL-запрос JOIN 'под капотом'. Это делает код работы с БД невероятно читаемым и объектно-ориентированным.

php
// Миграция для таблицы products (из архива, Упражнение 1.1)
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up() {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->foreignId('category_id')->constrained()->cascadeOnDelete();
            $table->string('name');
            $table->text('description')->nullable(); // поле может быть пустым
            $table->decimal('price', 8, 2); // 999999.99
            $table->timestamps();
        });
    }
    
    public function down() {
        Schema::dropIfExists('products');
    }
};
php
// Модель Product (app/Models/Product.php)
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model {
    // Разрешаем массовое заполнение этих полей
    protected $fillable = ['category_id', 'name', 'description', 'price'];

    // Настройка обратной связи "Один ко многим"
    public function category() {
        return $this->belongsTo(Category::class);
    }
}

Задание

Создайте структуру базы данных для каталога товаров.

  • Сгенерируйте модель Category вместе с миграцией: php artisan make:model Category -m
  • Сгенерируйте модель Product вместе с миграцией: php artisan make:model Product -m
  • В файле миграции categories добавьте $table->string('name');
  • В файле миграции products добавьте поля category_id, name, description и price.
  • Выполните команду php artisan migrate для создания таблиц в MySQL.
10 баллов

В чем разница между методами Eloquent find() и findOrFail()?

Какую команду Artisan нужно выполнить в терминале, чтобы применить все новые миграции и создать таблицы в базе данных?