Ответ вслух Senior Eloquent, N+1 и миграции обновлено

Active Record и Data Mapper

Вопрос

Eloquent реализует Active Record, Doctrine Data Mapper. В чём разница и когда что выбрать?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

В Active Record объект строки таблицы и есть модель: $order-save(), связи, скоупы, события, всё в одном классе. Eloquent позволяет очень быстро писать CRUD и типичную бизнес-логику, но модель смешивает предметную область и хранение, а тестировать логику без базы трудно.

Что должно прозвучать в ответе

  • Active Record: модель знает о базе, сама сохраняется, быстро писать

  • Data Mapper: сущности не знают о базе, EntityManager и Unit of Work

  • Минусы Active Record: смешение домена и персистентности, сложнее тестировать без БД

  • Doctrine: identity map, отложенный flush, сложнее порог входа

  • Выбор по сложности домена и команде

  • В Eloquent можно держать логику в сервисах и actions, модели тонкие

Что могут спросить следом

  • Что такое Unit of Work?
  • Как тестировать бизнес-логику с Eloquent?

Разбор

В Active Record объект строки таблицы и есть модель: $order->save(), связи, скоупы, события, всё в одном классе. Eloquent позволяет очень быстро писать CRUD и типичную бизнес-логику, но модель смешивает предметную область и хранение, а тестировать логику без базы трудно.

В Data Mapper, как в Doctrine, сущности это обычные объекты без знания о базе, а сохранением занимается EntityManager. Он реализует Unit of Work: отслеживает изменения загруженных сущностей и при flush записывает их одной транзакцией, а identity map гарантирует один объект на строку. Такая модель лучше подходит для сложного домена с инвариантами и DDD, но порог входа и объём кода выше.

Я выбираю по сложности: для большинства продуктовых сервисов Eloquent достаточно, если держать модели тонкими, а логику выносить в сервисы или actions и покрывать тестами с базой. Если домен сложный, с агрегатами и долгой жизнью кода, Symfony с Doctrine удобнее.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.