Ответ
Это два разных подхода к организации слоя доступа к данным (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 — для сложных предметных областей, где важны чистая архитектура, тестируемость и гибкость.