Как расширить этот простой DataMapper?

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
2 131
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо за Ваш ответ. Я думаю, что оставлю все так, как будто они основаны на ответе troelskn: «Если вы хотите оставаться ближе к базе данных, вам не следует пытаться абстрагироваться от отношений». Я хочу оставаться ближе к БД, потому что существующие запросы работают хорошо. (продолжение)

Jonas Follesø 08.11.2008 16:38

Таким образом, я действительно хочу реорганизовать только PHP, а не SQL. Думаю, я пробую интерфейс, аналогичный предложенному troelskn, который почти такой же, как есть, за исключением того, что я не инкапсулирую результаты в объект.

Jonas Follesø 08.11.2008 16:42

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

troelskn 08.11.2008 22:33

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

Другие вопросы по теме