Data Mapper Pattern - Как выбрать объекты по неидентифицированным полям? - PullRequest
2 голосов
/ 11 июля 2011

Я работал над проектом CMS (с использованием Zend Framework), чтобы освежить свои навыки и наткнуться на стену.Я решил на раннем этапе принять шаблон отображения данных (http://martinfowler.com/eaaCatalog/dataMapper.html) при обработке взаимодействия с базой данных благодаря хорошему разделению в логике между бизнес-моделью и базовым хранилищем.

Пример того, почему я хочу это разделениев том, что свойства объекта домена не обязательно будут иметь то же имя, что и базовый столбец базы данных (т. е. существует схема именования первичных ключей и внешних ключей, помогающая в автоматических вставках и отложенной загрузке).

Я адаптировал учебники, следуя &однако, основываясь на alivethedeepend.com, все примеры реализации / примера / учебника, которые я видел, полностью игнорируют способы обработки поиска, когда объекты не извлекаются по идентификатору. Я проверял учебники на нескольких языках, чтобы попытаться получить подсказку, нокажется, что все они обрабатывают только вставку, обновление по идентификатору, удаление по идентификатору и выбор по идентификатору!

Итак, у меня есть несколько вопросов, первый из которых заключается в том, как вы будете выполнять поиск на неосновныхключевые поля? Это обычный способ созданияконкретный метод для требуемого поиска, т.е. '$ entity-> findByName (' Bob ');'.Это кажется ужасно жестким и громоздким в долгосрочной перспективе.

А как насчет поиска свойств объекта, который имеет другое имя в базе данных?Я думал о том, чтобы иметь универсальный метод выбора, который принимает 3 аргумента (имя свойства объекта, модификатор для встраивания в предложении where, например '=' или '>' и значение для сопоставления).Но я не думаю, что это соответствует идее довольно жесткой структуры шаблона отображения данных.

Кто-нибудь может посоветовать, как лучше поступить?Кто-нибудь сталкивался с этим, и если да, то как ты с этим справился?

Я знаю, что такие проекты, как Doctrine, существуют, чтобы справиться с этим, однако я бы предпочел разработать «собственное» решение в настоящее время.

1 Ответ

4 голосов
/ 11 июля 2011

Наличие пары методов findByXXX() не более жестко, чем использование в ваших моделях геттеров и сеттеров для ваших свойств.

Что касается свойств с разными именами в базе данных: назовите ваши методы findByпосле свойств объекта, а не после столбцов базы данных.В конце концов, если ваше свойство объекта называется name и у вас есть метод getName() и setName(), логично, что метод селектора называется getByName(), даже если фактический столбец базы данных называется чем-то другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...