В популярных фреймворках для работы с базой данных, как правило, используется ORM, которая представляет собой вспомогательную прослойку между приложением и базой данных.
В зависимости от фреймворка, ORM может реализовывать паттерн Active Record (например, framework kohana, Yii) или Data Mapper (например, doctrine в symfony). ORM фреймворка также может реализовывать другой паттерн или гибрид.
ORM — Object Relational Mapping. Говоря самым простым языком, ряды из таблиц в базе данных, будут представлены в виде объектов, проперти которых соответствуют именам полей из таблиц, а значения пропертей объекта - значениям из базы данных. Одна строка в базе данных - один объект.
Итак, идем от более простого к более сложному: DAO -> Active Record -> Data Mapper.
Паттерн DAO
Используется в библиотеке DBSimple.
DAO (Data Access Object) - объект, который предоставляет абстрактный интерфейс к базе данных. Главной идеей DAO является сделать возможным определенные операции с данными не вдаваюсь в детали реализации базы данных.
При использовании DAO - функции для работы c конкретной таблицей хранятся в файле модели. Модель (таблица) наследует абстрактный класс, реализующий DAO.
При получение ряда в DAO - в результирующем объекте или массиве будут содержаться все поля из базы данных. Пример:
$user = TableUser::me()->fetchRowById($userId);
В переменной $user будет объект либо массив в зависимости от реализации, содержащий все поля из таблицы "user". Класс TableUser будет содержать все методы, которые работают с таблицей "user". Дополнительный класс репозитория тут не нужен. Почему? Если для получения данных создать класс репозиторий, то в модели (таблице) останется буквально единственный метод получения имени таблицы.
Для обновления данных в DAO - используются отдельные методы, реализующие прямые sql-запросы, в отличие от Active Record где меняется состояние модели и вызывается save() для персиста состояния в базу данных.
Паттерн Active Record
Используется в Kohana, Yii.
Это шаблон проектирования или один из слоев приложения, который несет ответственность за представление бизнес-логики и данных. Active Record позволяет создавать и использовать более просто те объекты, который требуют постоянного хранения в базе данных. Если говорить в отношении MVC, то Active Record реализует первую букву М - то есть модель.
Очень простой пример использования модели, реализующей паттерн Active Record в php:
$user = new User(); $user->name = 'name'; $user->email = 'email@dot.com'; $user->save();
Этот код вызовет генерацию такого sql-запроса:
INSERT INTO user (name, email) VALUES ('name', 'email@dot.com');
Как правило, внутри модели, которая реализует Active Record, прописаны property. В данном случае в модели User должны быть представлены как минимум property name, email. Содержимое класса User:
<?php class User extends \PDOMySQLModel { public $user_id; public $name; public $email; public function getTableName() { return 'user'; } }
Проперти, как правило, делают публичными, как в примере выше. Но, проперти модели могут быть и приватными, тогда отдельно создают сеттеры и геттеры под каждый проперти.
Как правило, Active Record Модель - это маппинг полей модели на поля в базе данных. В Active record сама модель отвечает за сохранение данных в базу данных. А это означает, что нарушется первый принцип из SOLID - принцип единственности ответственности. Класс отвечает не только за представление данных, но и за сохранение.
Паттерн Data Mapper
Используется в Hibernate в Java и в Doctrine2 в php, так в CycleOrm.
Data Mapper - это слой доступа к данным, который предоставляет двунаправленный маппинг данных между постоянным хранилищем данных (обычно, это sql база данных) и хранением данных в памяти (например, на время выполнениния php скрипта).
В отличие от Active Record, в Data Mapper появляется еще один слой или тип сущности такой как entityManager. Именно этот слой будет отвечать за перенос состояния модели в базу данных и обратно.
Комментарии 0