Урок 07

Модели Eloquent

Что такое Eloquent

Eloquent — это ORM (Object-Relational Mapping) Laravel. Он представляет каждую таблицу БД как класс PHP, а каждую строку — как объект. Вместо написания SQL ты работаешь с объектами и их свойствами.

Соглашение об именах

Модель Post автоматически связана с таблицей posts. Модель User — с users. Это правило можно переопределить через свойство $table.

Создание модели

php artisan make:model Post -m

Флаг -m создаёт миграцию вместе с моделью. Флаг -msfc создаст миграцию, сидер, фабрику и контроллер.

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

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = ['title', 'body', 'published_at'];

    protected $casts = [
        'published_at' => 'datetime',
        'is_active' => 'boolean',
    ];
}

$fillable

Белый список полей, которые можно массово присваивать через create() или update(). Защита от подмены полей.

$casts

Приведение типов. Поле published_at автоматически станет объектом Carbon (дата), is_active — булевым.

CRUD

Создание

$post = new Post();
$post->title = 'Первый';
$post->save();

$post = Post::create(['title' => 'Второй', 'body' => 'Текст']);

Чтение

$post = Post::find(1);
$post = Post::findOrFail(1);
$posts = Post::all();
$posts = Post::where('is_active', true)->get();
$post = Post::where('slug', 'hello')->firstOrFail();

Обновление

$post->update(['title' => 'Новый']);

Удаление

$post->delete();
Post::destroy(1);

Soft Deletes

Если нужно, чтобы записи не удалялись физически, а помечались как удалённые:

use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes;
}

В миграции:

$table->softDeletes();

Добавляется колонка deleted_at. Метод delete() проставляет дату. Восстановление:

$post->restore();
$post->forceDelete();

Скоупы

Скоуп — это переиспользуемое условие запроса:

public function scopePublished($query)
{
    return $query->where('published', true);
}

Использование:

Post::published()->get();

Аксессоры

Аксессор преобразует значение при чтении:

protected function title(): Attribute
{
    return Attribute::make(
        get: fn ($value) => ucfirst($value),
    );
}

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

Post::create($request->all()) небезопасно — пользователь может передать лишние поля. Используй $request->validated().