Миграции и Eloquent ORM: Создание таблиц товаров
Студент напишет миграции для создания таблиц базы данных и научится использовать модели Eloquent для удобной работы с записями.
Миграции базы данных. В традиционной разработке изменения структуры базы данных (создание таблиц, добавление колонок) выполняются через SQL-скрипты, что часто приводит к рассинхронизации баз у разных разработчиков в команде. Laravel решает эту проблему с помощью Миграций (Migrations). Миграции — это система контроля версий для вашей базы данных. Каждая миграция представляет собой PHP-класс с двумя методами: up() (выполняется при применении миграции) и down() (выполняется при откате миграции). Для создания миграции таблицы товаров используется команда Artisan: php artisan make:migration create_products_table. В методе up() мы используем фасад Schema и класс Blueprint для определения структуры. Для e-commerce проекта критически важны правильные типы данных: цена товара (price) должна храниться в формате DECIMAL (в Laravel это $table->decimal('price', 8, 2)), а не FLOAT, чтобы избежать ошибок округления при финансовых вычислениях. Также мы настраиваем внешние ключи (foreign keys) с помощью метода constrained()->cascadeOnDelete(), чтобы при удалении категории автоматически удалялись все связанные с ней товары, сохраняя целостность данных.
php
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);
$table->timestamps(); // Создает колонки created_at и updated_at
});
}
public function down() {
Schema::dropIfExists('products');
}
};
Введение в Eloquent ORM. Eloquent — это реализация паттерна ActiveRecord в Laravel. Это ORM (Object-Relational Mapping), который позволяет взаимодействовать с таблицами базы данных как с объектами классов (Моделями). Вместо написания сырых SQL-запросов (как мы делали с PDO), мы используем выразительный синтаксис PHP. Каждая таблица БД имеет соответствующую Модель. Таблица 'products' управляется моделью 'Product'. Модели генерируются командой php artisan make:model Product. Eloquent автоматически предполагает, что имя таблицы — это имя класса во множественном числе, а первичный ключ — колонка 'id'. Метод Mastery Learning требует глубокого понимания: Eloquent не заменяет SQL, он абстрагирует его. Под капотом Eloquent все равно использует PDO и подготовленные выражения, гарантируя защиту от SQL-инъекций. Получить все товары можно командой Product::all(). Найти товар по ID — Product::find(1). Для обработки ошибок 404 (Not Found) в контроллерах используется метод Product::findOrFail($id), который автоматически прервет выполнение и вернет страницу 404, если товар не найден в базе.
| Действие | Чистый SQL (PDO) | Eloquent ORM |
|---|---|---|
| Получить всё | SELECT * FROM products | Product::all() |
| Найти по ID | SELECT * FROM products WHERE id = ? | Product::find($id) |
| Добавить запись | INSERT INTO products (name) VALUES (?) | Product::create(['name' => 'Laptop']) |
| Фильтрация | SELECT * FROM products WHERE price > 100 | Product::where('price', '>', 100)->get() |
Связи (Relationships) в Eloquent. Реляционные базы данных основаны на связях между таблицами. В нашем интернет-магазине Категория (Category) имеет множество Товаров (Product) — это связь 'один ко многим' (One-To-Many). Eloquent позволяет описывать эти связи прямо в классах моделей в виде методов. В модели Category мы создаем метод products(), который возвращает $this->hasMany(Product::class). В модели Product мы создаем обратную связь: метод category(), возвращающий $this->belongsTo(Category::class). После настройки связей мы получаем доступ к мощнейшему инструменту — динамическим свойствам. Если у нас есть объект товара $product, мы можем получить название его категории просто обратившись к $product->category->name. Eloquent автоматически сгенерирует и выполнит нужный SQL-запрос JOIN за кулисами. Это значительно упрощает код контроллеров и шаблонов Blade, делая его читаемым как обычный английский текст.
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);
}
}