Что такое Eloquent ORM?php-69

Eloquent ORM — это реализация шаблона Active Record в Laravel, предоставляющая элегантный объектно-ориентированный интерфейс для работы с базой данных.

Основные концепции Eloquent

1. Active Record Pattern

Каждая модель Eloquent соответствует таблице в БД:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // Автоматически связывается с таблицей 'users'
}

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

php artisan make:model Product -mcr

Флаги:

  • -m Создать миграцию
  • -c Создать контроллер
  • -r Ресурсный контроллер

CRUD операции

1. Создание записи

$user = new User();
$user->name = 'John';
$user->email = 'john@example.com';
$user->save();

// Или сокращенный вариант
$user = User::create([
    'name' => 'John',
    'email' => 'john@example.com'
]);

2. Чтение данных

// Все пользователи
$users = User::all();

// С условиями
$activeUsers = User::where('active', 1)
               ->orderBy('name')
               ->take(10)
               ->get();

3. Обновление

$user = User::find(1);
$user->name = 'John Doe';
$user->save();

// Массовое обновление
User::where('active', 1)->update(['active' => 0]);

4. Удаление

$user = User::find(1);
$user->delete();

// Прямое удаление
User::destroy(1);

// Мягкое удаление (soft delete)
class User extends Model
{
    use SoftDeletes;
}

Отношения

1. Один к одному

class User extends Model
{
    public function phone()
    {
        return $this->hasOne(Phone::class);
    }
}

2. Один ко многим

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

3. Многие ко многим

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

Продвинутые возможности

1. Мутаторы и аксессоры

class User extends Model
{
    // Аксессор
    public function getNameAttribute($value)
    {
        return ucfirst($value);
    }

    // Мутатор
    public function setNameAttribute($value)
    {
        $this->attributes['name'] = strtolower($value);
    }
}

2. Ленивая и жадная загрузка

// Ленивая (отложенная)
$books = App\Models\Book::all();
foreach ($books as $book) {
    echo $book->author->name; // N+1 проблема
}

// Жадная загрузка
$books = App\Models\Book::with('author')->get();

3. Локальные scope'ы

class User extends Model
{
    public function scopeActive($query)
    {
        return $query->where('active', 1);
    }
}

// Использование
$activeUsers = User::active()->get();

4. События модели

class User extends Model
{
    protected static function booted()
    {
        static::creating(function ($user) {
            $user->api_token = Str::random(60);
        });
    }
}

Производительность

1. Чанкование данных

User::chunk(200, function ($users) {
    foreach ($users as $user) {
        // Обработка
    }
});

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

User::create($request->only(['name', 'email']));

// Защищенные поля
protected $guarded = ['id', 'is_admin'];
// Или разрешенные
protected $fillable = ['name', 'email'];

3. Ресурсы для API

php artisan make:resource UserResource

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

return new UserResource(User::find(1));

Best Practices

  1. Не обрабатывайте данные в контроллерах - используйте Service Layer
  2. Избегайте N+1 проблемы - всегда проверяйте с ->toSql()
  3. Используйте очереди для ресурсоемких операций
  4. Валидируйте данные перед сохранением

Резюмируем:

Eloquent ORM — это мощный инструмент Laravel, который значительно упрощает работу с базой данных, предоставляя выразительный синтаксис для сложных операций. При правильном использовании он позволяет писать чистый, поддерживаемый код, сохраняя при этом высокую производительность.