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

Миграции и структура базы данных

Проектирование базы данных интернет-магазина. Создание таблиц товаров и категорий с помощью системы контроля версий баз данных Laravel (Миграций).

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

Миграции: Git для вашей базы данных

При разработке интернет-магазина в команде (или даже в одиночку при переносе проекта на хостинг) возникает проблема: как синхронизировать структуру базы данных? Если вы вручную создадите таблицу products через phpMyAdmin, то при деплое (публикации) приложения вам придется делать это снова на боевом сервере. И здесь на помощь приходят Миграции Laravel.

Миграции — это система контроля версий для вашей базы данных. Вместо SQL-запросов вы описываете структуру таблиц с помощью PHP-кода. Laravel сам переведет этот код в нужный диалект SQL (MySQL, PostgreSQL, SQLite). Каждая миграция содержит два метода: up() (выполняется при накатывании миграции, например, создание таблицы) и down() (выполняется при откате, отменяет действия метода up, например, удаляет таблицу).

Для создания миграции используется Artisan-команда php artisan make:migration create_products_table. Laravel создаст файл в папке database/migrations с временной меткой в имени (чтобы гарантировать правильный порядок выполнения). Внутри вы используете фасад Schema и класс Blueprint для определения колонок: строк, чисел, дат и связей (внешних ключей).

php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    // Метод up() создает таблицу и колонки
    public function up() {
        Schema::create('products', function (Blueprint $table) {
            $table->id(); // Первичный ключ, автоинкремент (bigint (BIGINT UNSIGNED)
            
            // Внешний ключ, связывающий товар с таблицей categories
            // cascadeOnDelete() удалит товары, если удалить их категорию
            $table->foreignId('category_id')->constrained()->cascadeOnDelete();
            
            $table->string('name'); // VARCHAR(255)
            $table->text('description')->nullable(); // Текст, может быть NULL
            $table->decimal('price', 8, 2); // Число с плавающей точкой (999999.99)
            
            // Автоматически создает колонки created_at и updated_at
            $table->timestamps(); 
        });
    }

    // Метод down() отменяет изменения (вызывается при откате)
    public function down() {
        Schema::dropIfExists('products');
    }
};

Типы данных и Внешние ключи

В примере выше мы использовали специфичные для Laravel методы определения колонок. Разберем их подробнее, так как правильная структура БД критична для e-commerce.

Метод $table->decimal('price', 8, 2) идеально подходит для хранения цен. В отличие от типа float, decimal не имеет проблем с потерей точности при математических операциях (что недопустимо при работе с деньгами). Цифра 8 означает общее количество знаков, а 2 — количество знаков после запятой.

Метод $table->foreignId('category_id')->constrained() — это магия Laravel. Он автоматически создает колонку типа BIGINT UNSIGNED, а метод constrained() догадывается (по имени колонки category_id), что внешний ключ должен ссылаться на колонку id в таблице categories. Метод cascadeOnDelete() гарантирует целостность данных: если администратор удалит категорию 'Ноутбуки', все ноутбуки в БД будут автоматически удалены, предотвращая появление 'осиротевших' записей.

Типичная ошибка: попытка создать таблицу products до создания таблицы categories. Поскольку products ссылается на categories, миграция категорий должна иметь более раннюю дату в имени файла (выполняться первой). Иначе СУБД выдаст ошибку создания внешнего ключа.

Для чего используется метод $table->timestamps() в миграциях Laravel?

Напишите команду Artisan, которая применяет (запускает) все ожидающие миграции в базу данных.

Задание

Сценарий: Вы допустили ошибку в структуре таблицы и нужно ее исправить. База данных пока пустая (находится в разработке).

  • Выполните команду php artisan migrate:rollback, чтобы отменить последнюю партию миграций (вызовется метод down()).
  • Откройте файл миграции create_products_table.
  • Добавьте новое поле: $table->boolean('is_active')->default(true);
  • Снова выполните php artisan migrate, чтобы применить обновленную структуру таблиц.
10 баллов