Урок 6: Eloquent ORM в Laravel

В 6-ом уроке мы погрузимся в одну из самых мощных возможностей Laravel, это Eloquent ORM. Если вы хотите работать с базами данных как с обычными объектами, избегая сложных SQL-запросов, то этот урок станет вашим лучшим другом. Мы разберем создание моделей, базовые методы Eloquent, массовое присваивание и CRUD-операции. Всё это будет с примерами кода и задачами для закрепления.

Что такое Eloquent ORM?

Eloquent это объектно-реляционное отображение (ORM), встроенное в Laravel. Оно позволяет взаимодействовать с таблицами базы данных как с объектами и классами. Вместо написания сырых SQL-запросов вы работаете с моделями, которые автоматически связываются с таблицами. Например, модель Post будет связана с таблицей posts, а её свойства с колонками таблицы.

Главные преимущества Eloquent:

  • Чистый и читаемый код.
  • Автоматизация рутинных операций.
  • Безопасность (избегаем SQL-инъекций).

Создание модели и работа с таблицей

По соглашению Eloquent, имя модели в единственном числе (например, User), а таблица во множественном (users). Если ваша таблица называется иначе, вы можете указать это в модели.

Создадим модель через Artisan:

bash
php artisan make:model Post

Эта команда создаст файл app/Models/Post.php (или app/Post.php в старых версиях Laravel). Если нужно создать миграцию вместе с моделью, добавьте флаг -m:

bash
php artisan make:model Post -m

Пример модели Post:

php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // Если таблица называется не "posts", укажите это:
    protected $table = 'my_posts'; 
    
    // Поля для массового присваивания (об этом позже)
    protected $fillable = ['title', 'content'];
}

Методы all(), find(), where(), first()

Eloquent предоставляет десятки методов для выборки данных. Начнем с базовых.

1. all() — получить все записи

php
use App\Models\Post;

// Получить все посты из таблицы
$posts = Post::all();

foreach ($posts as $post) {
    echo $post->title;
}

2. find() — найти запись по ID

php
// Найти пост с ID = 1
$post = Post::find(1);
echo $post->title;

3. where() — фильтрация по условию

php
// Получить все посты, где автор_id = 5
$posts = Post::where('author_id', 5)->get();

// Комбинируем условия
$posts = Post::where('views', '>', 100)
             ->where('status', 'published')
             ->get();

4. first() — получить первую запись, соответствующую условию

php
// Первый опубликованный пост
$post = Post::where('status', 'published')->first();
echo $post->title;

Массовое присваивание и $fillable

Массовое присваивание (mass assignment) это заполнение полей модели массивами данных. Например, при создании поста из данных формы:

php
Post::create([
    'title' => 'Новый пост',
    'content' => 'Текст...',
    'author_id' => 1
]);

Но здесь есть опасность: злоумышленник может передать лишние поля (например, is_admin), если они есть в таблице. Чтобы этого избежать, используйте свойство $fillable в модели, которое указывает, какие поля можно заполнять массово.

Пример:

php
class Post extends Model
{
    protected $fillable = ['title', 'content', 'author_id'];
}

Если вы доверяете всем полям, можно разрешить массовое присваивание для всех:

php
protected $guarded = []; // Не рекомендуется для полей вроде is_admin!

Сохранение, обновление и удаление записей

1. Сохранение новой записи

Способ 1: Через метод create()

php
Post::create([
    'title' => 'Заголовок',
    'content' => 'Текст...'
]);

Способ 2: Через создание объекта и save()

php
$post = new Post();
$post->title = 'Заголовок';
$post->content = 'Текст...';
$post->save(); // Запись сохранится в БД

2. Обновление записи

Способ 1: Через метод update()

php
$post = Post::find(1);
$post->update(['title' => 'Новый заголовок']);

Способ 2: Изменение свойств и вызов save()

php
$post = Post::find(1);
$post->title = 'Новый заголовок';
$post->save();

3. Удаление записи

Способ 1: Через метод delete()

php
$post = Post::find(1);
$post->delete();

Способ 2: Через статический метод destroy()

php
Post::destroy(1); // Удалить пост с ID=1
Post::destroy([1, 2, 3]); // Удалить несколько записей

Практические задачи

Закрепим знания на примерах!

Задача 1: Создание модели и миграции

  1. Создайте модель Category с миграцией.
  2. В миграции добавьте колонки: name (string), description (text).
  3. Запустите миграцию: php artisan migrate.

Решение:

bash
php artisan make:model Category -m

В файле миграции:

php
public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->text('description');
        $table->timestamps();
    });
}

Задача 2: Работа с методами Eloquent

  1. Создайте 3 категории через метод create().
  2. Найдите категорию с ID=2 и измените её описание.
  3. Удалите категорию с ID=3.

Решение:

php
// Создание
Category::create(['name' => 'PHP', 'description' => 'Статьи о PHP']);
Category::create(['name' => 'Laravel', 'description' => 'Laravel-материалы']);
Category::create(['name' => 'JavaScript', 'description' => 'JS-туториалы']);

// Обновление
$category = Category::find(2);
$category->update(['description' => 'Фреймворк Laravel']);

// Удаление
Category::destroy(3);

Задача 3: Использование where() и first()

Найдите первую категорию, имя которой начинается на «Lara», и выведите её описание.

Решение:

php
$category = Category::where('name', 'like', 'Lara%')->first();
echo $category->description; // "Фреймворк Laravel"

Итоги шестого урока по Laravel

Вы освоили основы Eloquent ORM. Теперь вы можете:

  • Создавать модели и связывать их с таблицами.
  • Использовать методы all()find()where()first().
  • Работать с массовым присваиванием через $fillable.
  • Выполнять CRUD-операции (создание, чтение, обновление, удаление).

Пишите меньше кода, делайте больше. Laravel заботится о вашей производительности.

Полный курс по Laravel для начинающих: https://max-gabov.ru/laravel-dlya-nachinaushih