Модели 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().