PHP ORM с полной поддержкой составного первичного / внешнего ключа - PullRequest
6 голосов
/ 07 ноября 2010

Я ищу PHP5 ORM, который полностью поддерживает составные (многоколонные) отношения на основе составных первичных ключей и внешних ключей.

Я надеялся, что Doctrine 2 решит эту проблему, но это не так. Это базовая функция моделирования реляционных данных, но ни одно из известных мне программ PHP ORM не поддерживает ее.

Я недавно обнаружил, что SQLAlchemy имеет полную поддержку, но мне нужно что-то для PHP, а не для Python.

Ответы [ 4 ]

4 голосов
/ 08 ноября 2010

Когда вы подходите к приложению с точки зрения базы данных, что-то вроде Doctrine2 (PHP) или Hibernate (Java), из которого оно «получено», не подходит. Они гораздо больше подходят, когда вы хотите пойти другим путем (например, «у меня есть модель предметной области OO, и мне нужно сохранить ее в реляционном БД», а не «у меня есть реляционный БД и я хочу (сгенерированный?) Интерфейс ОО» для этого, без каких-либо компромиссов на стороне базы данных "). Если вы используете их, несмотря на это важное различие в подходах, и вам нравится ваша реляционная схема больше, чем ваша объектная модель, вы просто расстроитесь.

Очень важно различать разные категории инструментов ORM, поскольку они, как правило, фокусируются на разных моделях разработки.

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

Такие решения, как Doctrine2 или Hibernate, препятствуют использованию составных ключей и, следовательно, поддерживают их только до определенного уровня (Hibernate идет довольно далеко, но, тем не менее, их не рекомендуется использовать).

Лично я не фанат составных ключей (за исключением чистых таблиц ссылок «многие ко многим» без дополнительных данных), потому что я склонен подходить к вещам гораздо больше со стороны приложения / модели домена / объекта и там составные ключи, которые сопоставляются с объектами, часто являются трудной задачей, даже если базовая технология сопоставления поддерживает их. Суррогатные ключи (или, по крайней мере, натуральные ключи с одним полем) делают вещи намного проще. Я не фетишист реляционной базы данных-нормализации, и «лучшая производительность» очень сомнительна с моей точки зрения. Сохранение случайного объединения не спасет вас, если у вас возникнут реальные проблемы с производительностью в системе.

1 голос
/ 02 июня 2011

Doctrine 2.1 полностью решает эту проблему.

0 голосов
/ 05 января 2012

Вы можете попробовать LEAP ORM , который написан на PHP 5. Он доступен на github по адресу https://github.com/spadefoot/kohana-orm-leap.

Leap ORM полностью поддерживает составные ключи, оба для первичных ключей.и внешние ключи.Аналогично, он работает с нецелыми первичными / внешними ключами.В моделях ORM вы можете создавать псевдонимы полей, адаптеры полей и отношения.

Хотя он написан для Kohana PHP Framework , вы можете легко заставить его работать с любым фреймворком PHP,просто добавив к вашему коду простую функцию автозагрузки.Leap работает со следующими базами данных: DB2, Drizzle, Firebird, MariaDB, MS SQL, MySQL, Oracle, PostgreSQL и SQLite.Он также предоставляет как конструктор запросов, так и пул соединений с базой данных.

На веб-сайте ORM есть множество хороших примеров и руководств , которые помогут вам понять, как его использовать.

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

Из ссылки Doctrine2:

Doctrine 2 позволяет использовать составные первичные ключи.Однако существуют некоторые ограничения в отношении использования одного идентификатора.Использование аннотации @GeneratedValue поддерживается только для простых (не составных) первичных ключей, что означает, что вы можете использовать составные ключи только в том случае, если вы сами генерируете значения первичного ключа перед вызовом EntityManager # persist () для сущности.

Чтобы назначить составной первичный ключ / идентификатор, просто поместите аннотацию @Id на все поля, составляющие первичный ключ.

...