В чем разница между паттернами Active Record и Data Mapper?

«В чем разница между паттернами Active Record и Data Mapper?» — вопрос из категории Паттерны, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это два разных подхода к организации слоя доступа к данным (ORM).

Active Record — это когда объект бизнес-логики «знает», как сохранить себя в БД. Объект содержит и данные, и методы для работы с ними (CRUD).

// Пример с Eloquent (Laravel), который реализует Active Record
$user = new User();
$user->name = 'Иван';
$user->email = 'ivan@example.com';
$user->save(); // Объект сам вызывает INSERT

$foundUser = User::find(1); // Статический метод на классе модели
$foundUser->delete();

Плюсы: Простота и скорость разработки для CRUD-операций. Минусы: Нарушение принципа единой ответственности (SRP), бизнес-логика тесно связана с БД, что усложняет тестирование и поддержку в сложных доменах.

Data Mapper — это слой, который полностью отделяет бизнес-объект (сущность) от механизма его сохранения. Сущность ничего не знает о БД. За преобразование объекта в строки таблицы и обратно отвечает отдельный класс-маппер.

// Пример с Doctrine, который реализует Data Mapper
// 1. Сущность — простой POPO (Plain Old PHP Object)
class User {
    private $id;
    private $name;
    // ... геттеры и сеттеры, без логики сохранения
}

// 2. Работа через EntityManager (маппер)
$user = new User();
$user->setName('Иван');

$entityManager->persist($user); // Сообщаем мапперу о новом объекте
$entityManager->flush(); // Маппер синхронизирует состояние объектов с БД (выполняет INSERT)

$foundUser = $entityManager->find(User::class, 1); // Маппер загружает данные и создает объект
$entityManager->remove($foundUser);
$entityManager->flush();

Плюсы: Чистая архитектура, строгое разделение ответственности, бизнес-логика легко тестируется (можно использовать моки для маппера). Минусы: Большая начальная сложность, больше шаблонного кода.

Вывод: Active Record отлично подходит для простых приложений и быстрого прототипирования. Data Mapper — для сложных предметных областей, где важны чистая архитектура, тестируемость и гибкость.