Eloquent ORM и модели
Освоение паттерна ActiveRecord в Laravel. Создание моделей для работы с базой данных без написания SQL-запросов. Выполнение CRUD операций (создание, чтение, обновление, удаление).
Eloquent ORM: Объектно-Реляционное Отображение
До сих пор, изучая PHP, мы писали SQL-запросы вручную, используя PDO (например, SELECT * FROM products WHERE price > 100). Laravel предоставляет гораздо более элегантный способ работы с базой данных — Eloquent ORM.
Eloquent реализует архитектурный паттерн Active Record. Это означает, что каждая таблица в вашей базе данных имеет соответствующий класс PHP (Модель), который используется для взаимодействия с этой таблицей. Экземпляр (объект) этой модели представляет собой одну строку в таблице. То есть, вместо работы с массивами сырых данных из БД, вы работаете с полноценными объектами, вызывая их методы.
Чтобы создать модель товара, мы используем команду php artisan make:model Product. По умолчанию Laravel предполагает, что модель Product (в единственном числе, с большой буквы) связана с таблицей products (во множественном числе, с маленькой буквы, в змеином регистре). Вам даже не нужно указывать имя таблицы внутри класса модели, если вы следуете этому соглашению об именовании!
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
// Свойство $fillable защищает от уязвимости Mass Assignment
// Здесь мы перечисляем поля, которые разрешено заполнять массово (например, из формы)
protected $fillable = [
'category_id',
'name',
'description',
'price'
];
}
// --- Примеры использования Eloquent в Контроллере --- //
// 1. Получить все товары
$allProducts = Product::all();
// 2. Найти товар по ID. Если не найден - вернет null
$product = Product::find(1);
// 3. Найти товар по ID. Если не найден - выбросит 404 ошибку (ModelNotFoundException)
$product = Product::findOrFail(1);
// 4. Построитель запросов (Query Builder) в Eloquent
$cheapProducts = Product::where('price', '<', 1000)
->orderBy('name', 'asc')
->get();
Создание, Обновление и Удаление (CUD-операции)
Чтение данных (Read) — это только начало. В административной панели магазина вам потребуется создавать, редактировать и удалять товары. Eloquent делает этот процесс интуитивно понятным.
Для создания новой записи мы используем метод create(), передавая ему ассоциативный массив данных. Важно! Этот метод будет работать только в том случае, если вы определили свойство $fillable в модели (как показано в примере выше). Это защита от уязвимости Mass Assignment (Массовое заполнение). Если злоумышленник подделает HTTP-запрос и добавит поле is_admin => true, Eloquent проигнорирует его, если его нет в массиве $fillable.
Для обновления мы сначала находим нужную модель (например, через findOrFail()), затем вызываем метод update(), передавая новые данные, либо меняем свойства объекта напрямую и вызываем метод save(). Для удаления используется метод delete() на экземпляре модели.
Примечание: При сохранении сложных данных, например, при оформлении заказа, когда нужно одновременно сохранить данные в таблицу orders и в таблицу order_items, необходимо использовать транзакции базы данных (DB::transaction), чтобы гарантировать атомарность операций (либо сохранится всё, либо ничего).
// --- Создание (Create) ---
$newProduct = Product::create([
'category_id' => 1,
'name' => 'MacBook Pro',
'description' => 'Мощный ноутбук для разработчиков',
'price' => 2500.00
]);
// --- Обновление (Update) ---
$productToUpdate = Product::findOrFail(1);
$productToUpdate->update([
'price' => 2400.00 // Делаем скидку
]);
// Альтернативный способ обновления:
// $productToUpdate->price = 2400.00;
// $productToUpdate->save();
// --- Удаление (Delete) ---
$productToDelete = Product::findOrFail(2);
$productToDelete->delete();