Как расширить этот простой DataMapper? - PullRequest
1 голос
/ 08 ноября 2008

Может кто-нибудь привести конкретный пример из следующего:

http://www.urdalen.com/blog/?p=210

.. это показывает, как бороться с one-to-many и many-to-many отношениями?

Я написал автору некоторое время назад, но не получил ответа. Мне нравится его идея, но я не могу понять, как воплотить ее в жизнь, помимо простых отношений в одной таблице.

Примечание: я не хочу использовать полноценную ORM. Мне нравится делать мой SQL вручную. Я хотел бы улучшить дизайн кода моего приложения. Прямо сейчас каждый объект домена имеет свой собственный класс, полный запросов, заключенных в статические методы. Они просто возвращают скаляр, 1d-массив (запись) или 2d-массив (набор записей) в зависимости от запроса.

Ответы [ 3 ]

6 голосов
/ 08 ноября 2008

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

Если вы хотите оставаться близко к базе данных (избегая ORM), то вам не следует пытаться абстрагироваться от отношений. То, как я пишу datamappers, выглядит примерно так:

$car42 = $car_gateway->fetch(42);
$wheels = $wheel_gateway->selectByCar($car42);

В отличие от способа ORM:

$car42 = $car_gateway->fetch(42);
$wheels = $car42->selectWheels();

Это означает, что шлюзы в конечном итоге попадают в ваш клиентский код, но это также делает вещи очень прозрачными и близкими к базе данных.

1 голос
/ 31 декабря 2008

Если вы ищете простой и переносимый DataMapper ORM, взгляните на phpDataMapper . Это только зависимости PHP5 и PDO, и он очень маленький и легкий. Он поддерживает табличные отношения и некоторые другие очень приятные функции.

0 голосов
/ 08 ноября 2008

Учитывая ваш ответ на ответ Тома, я бы порекомендовал вам взглянуть на что-то вроде Zend Framework. Его ORM имеет архитектуру «возьми или оставь», которая может быть реализована поэтапно.

Когда я пришел к моему нынешнему работодателю, у них было заявление, которое было только что заполнено несколькими месяцами ранее, но прошло одну или две предыдущие версии, а текущая версия находилась в разработке на шесть месяцев дольше, чем предполагалось. Тем не менее, кодовая база была беспорядочной. Например, не было абстракции между логикой доступа к базе данных и бизнес-логикой. И они хотели, чтобы я продвигал сайт вперед, создавая новые функциональные возможности, расширяя существующие функции и исправляя существующие ошибки в коде. Чтобы еще больше усложнить ситуацию, они не использовали никакой формы санитарии для ввода или вывода данных.

Когда я начал вникать в проблему, я понял, что мне нужно решение абстрактных проблем, которое можно было бы реализовать поэтапно, поскольку они, очевидно, не собирались полностью переписывать. Мой первоначальный подход состоял в том, чтобы написать собственный ORM и DAL, который бы сделал тяжелую работу для меня. Он отлично работал, потому что не вмешивался в существующую кодовую базу, и поэтому позволял мне незаметно перемещать целые части приложения в новую архитектуру.

Однако, после того, как большая часть пользовательской области нашего сайта была перенесена в эту новую структуру и построено целое приложение на моей пользовательской инфраструктуре (которая также включает в себя пользовательский интерфейсный контроллер и реализацию mvc), Я перехожу на Zend Framework (это мой выбор, хотя я уверен, что некоторые другие фреймворки также будут работать в этой ситуации).

При переходе на Zend Framework у меня нет абсолютно никаких опасений по поводу устаревшей базы кода, потому что:

  • Я могу создавать новые модели и рефакторинг старые модели (построено по моему заказу рамки) ненавязчиво.
  • Я могу реорганизовать существующие контроллеры (такие как они) должны быть завернутый в класс, который ведет себя в соответствии с Zend's Рамки MVC, чтобы он стал небольшая проблема на самом деле начать использовать Контроллер внешнего интерфейса Zend.
  • Наши взгляды уже встроены Умничка, так что мне не о чем беспокоиться о разделении контроллера и просмотра логика, но я смогу расширить Zend Framework, чтобы я мог визуализировать существующие шаблоны в Smarty при создании новых шаблонов в прямой PHP.

По сути, Zend Framework имеет архитектуру «забирай или уходи», которая позволяет использовать его в существующих проектах, потому что новый код и переработанный код не должны вмешиваться в существующий код.

...