Работали ли вы с Eloquent ORM в Laravel?

Ответ

Да, Eloquent ORM — это основной инструмент для работы с данными в моих Laravel-проектах. Это реализация паттерна Active Record.

Базовые операции и примеры:

// Создание
$user = User::create(['name' => 'Alex', 'email' => 'alex@example.com']);

// Чтение с условиями
$activeUsers = User::where('is_active', true)
                  ->whereHas('posts', function ($query) {
                      $query->where('published_at', '>', now()->subWeek());
                  })
                  ->orderBy('name')
                  ->paginate(15);

// Отношения (Relationships)
class User extends Model {
    public function posts(): HasMany { return $this->hasMany(Post::class); }
    public function latestPost(): HasOne { return $this->hasOne(Post::class)->latestOfMany(); }
    public function roles(): BelongsToMany { return $this->belongsToMany(Role::class); }
}

// Eager Loading для решения проблемы N+1
$users = User::with(['posts' => function ($query) {
    $query->where('status', 'published');
}])->get();

foreach ($users as $user) {
    foreach ($user->posts as $post) { // Никаких дополнительных запросов
        echo $post->title;
    }
}

Продвинутый опыт:

  • Мутаторы/Аксессоры: Использовал для форматирования данных (например, хеширования пароля в сеттере, форматирования даты в геттере).
  • Глобальные скоупы (Global Scopes): Добавлял мягкое удаление (SoftDeletes) и скоупы для мультитенантности.
  • События моделей (Observers): Назначал наблюдателей для логирования изменений или отправки уведомлений.
  • Производительность: Для тяжелых отчетов иногда комбинировал Eloquent с DB::raw() или использовал chunk()/cursor() для обработки больших данных без перегрузки памяти.
  • Тестирование: Писал фабрики (Factories) и сиды (Seeders) для наполнения базы тестовыми данными.

Ответ 18+ 🔞

Слушай, а Eloquent ORM — это же, блядь, просто хлеб насущный в любом нормальном Laravel-проекте. Без него нихуя не сделать, это как Active Record, только с русской душой, понимаешь? Без него ты как без рук, чистая правда.

Ну, поехали, базовые штуки:

// Создание записи — проще некуда
$user = User::create(['name' => 'Alex', 'email' => 'alex@example.com']);

// А вот чтение с условиями — тут уже можно мозги включать
$activeUsers = User::where('is_active', true)
                  ->whereHas('posts', function ($query) {
                      $query->where('published_at', '>', now()->subWeek());
                  })
                  ->orderBy('name')
                  ->paginate(15);

Ёпта, а отношения (relationships) — это вообще песня! Ты просто объявляешь метод в модели, и всё, хуй с горы, можно цеплять данные как по маслу.

class User extends Model {
    public function posts(): HasMany { return $this->hasMany(Post::class); }
    public function latestPost(): HasOne { return $this->hasOne(Post::class)->latestOfMany(); }
    public function roles(): BelongsToMany { return $this->belongsToMany(Role::class); }
}

Но главное, чувак, не наступи на эти грабли — проблему N+1. Без with() твое приложение сожрёт столько запросов, что сервер просто ляжет и не встанет. А с ним — красота.

$users = User::with(['posts' => function ($query) {
    $query->where('status', 'published');
}])->get();

foreach ($users as $user) {
    foreach ($user->posts as $post) { // И ни одного лишнего запроса, мать его!
        echo $post->title;
    }
}

А теперь про продвинутый уровень, там где уже пахнет жареным.

  • Мутаторы и аксессоры — это как скрытая магия. Нужно пароль захэшировать перед сохранением или дату красиво отформатировать при выводе? Без проблем, пишешь метод в модели, и Eloquent сам всё сделает. Удобно, блядь, до охуения.
  • Глобальные скоупы (Global Scopes) — моя любовь. SoftDeletes — это святое. А если проект мультитенантный, то скоупы, которые автоматом подставляют where('tenant_id', ...) — это спасение от дурака. Без них доверия ебать ноль, что кто-то не забудет этот фильтр.
  • События моделей и наблюдатели (Observers) — мощнейшая штука. Нужно залогировать каждое изменение пользователя или отправить уведомление, когда заказ оплачен? Вешаешь Observer и спишь спокойно. Всё в одном месте, а не размазано по контроллерам.
  • Производительность — вот где собака порылась. Когда пишешь какой-нибудь тяжёлый отчёт, чистый Eloquent иногда начинает тупить, как старая кобыла. Тут приходится лезть в DB::raw() или использовать chunk() и cursor(), чтобы не сожрать всю оперативку, обрабатывая миллион записей разом. Иначе будет тебе хиросима, а не отчёт.
  • Тестирование — без фабрик и сидеров сейчас вообще никуда. Наполнить базу правдоподобными тестовыми данными за секунду — это не просто удобно, это необходимость. Иначе будешь вручную писать массивы, а это пиздец какой кошмар.

В общем, Eloquent — инструмент на все случаи жизни. С одной стороны, простой и интуитивный, а копнёшь глубже — там целая вселенная возможностей, лишь бы голова работала. Главное — не бояться в документацию заглядывать, там много чего полезного зарыто.