Миграции баз данных и Eloquent ORM
Создание таблиц через миграции и выполнение CRUD-операций с помощью моделей Laravel.
В традиционной разработке создание структуры базы данных (таблиц, столбцов, ключей) выполняется вручную через 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 'под капотом'. Это делает код работы с БД невероятно читаемым и объектно-ориентированным.
// Миграция для таблицы 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');
}
};
// Модель 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.