Есть ли хорошая библиотека объектно-реляционного сопоставления для PHP?
Я знаю о PDO / ADO, но они, кажется, предоставляют только абстракцию различий между поставщиками баз данных, а не фактическое сопоставление между моделью предметной области и реляционной моделью. Я ищу библиотеку PHP, которая работает аналогично Спящий режим для Java и NHibernate для .NET.






Загляните в Доктрина.
Доктрина 1.2 реализует Active Record. Доктрина 2+ - ORM DataMapper.
Также проверьте Xyster. Он основан на шаблоне Data Mapper.
Также обратите внимание на DataMapper против Active Record.
Хороших всего два: Доктрина и Продвигать. Мы предпочитаем Doctrine, и она хорошо работает с Symfony. Однако, если вы ищете поддержку баз данных помимо основных, вам придется написать свой собственный код.
Поскольку этот вопрос довольно часто связан с SO, я хотел бы отметить, что Propel является прекращенным проектом с 2020 года. Совместимость с PHP7 так и не была реализована. Поэтому выбор Propel в качестве ORM для нового программного проекта в 2020 году - не лучшая идея.
Я использую Doctrine несколько лет и ненавижу ее. Не потому, что он не работает, а потому, что он сильно раздут, потребляет много памяти, работает медленно и генерирует миллионы запросов к вашей БД при выполнении операций в фоновом режиме. Это работает, не поймите меня неправильно, но вы потратите много времени на изучение этого и его нюансов, которые, честно говоря, очень расстраивают, если у вас есть большие зависимые наборы данных. Doctrine, без сомнения, широко используется, но если бы я выбрал ORM сегодня, Doctrine НЕ была бы моим первым выбором или даже вторым ... JM5C.
@mrodo Propel не прекращена. Propel версии 2 все еще находится в активной разработке для PHP 7.2 и выше.
Доктрина, вероятно, ваш лучший выбор. До Doctrine DB_DataObject была, по сути, единственной другой утилитой с открытым исходным кодом.
Мне очень нравится Продвигать, здесь, вы можете получить обзор, документация довольно хорош, и вы можете получить его через PEAR или SVN.
Вам нужна только рабочая установка PHP5 и Phing, чтобы начать генерировать классы.
Propel также может «реконструировать» существующую схему базы данных, создавая объекты PHP на основе чтения схемы базы данных.
Я сам занимался разработкой Pork.dbObject. (Простая реализация PHP ORM и Active Record) Основная причина в том, что я считаю большинство ORM слишком тяжелыми.
Основная идея Pork.dbObejct - сделать его легким и простым в настройке. Никаких групп XML-файлов, только один вызов функции в конструкторе для его привязки и addRelation или addCustomRelation для определения отношения к другому объекту dbObject.
Взгляните: Pork.dbObject
Сегодня я искал легкую реализацию PHP ORM и благодаря этому сообщению нашел Pork.dbObject. Отлично работает! +1
Дууд! Это довольно интересно. Я вижу, что последнее обновление произошло где-то в 2009 году. Это все еще сохраняется? Если нет ... я бы мог его оживить :)
Проверьте Выходной ORM. Он проще, чем Propel и Doctrine, и работает аналогично Hibernate, только с большей частью PHP.
Я пробовал это. Мне пришлось указать одни и те же свойства объекта в трех местах - конфигурации, модели и схеме базы данных. Это большая работа для внедрения ORM IMO.
Розетка очень тяжеловесна.
Я пробовал это (1.0 RC1), и он был очень глючным даже в основных функциях. И да, нужно написать много настроек. Не рекомендую.
Я только начал с Кохана, и он кажется наиболее близким к Ruby on Rails, не задействуя всю сложность нескольких файлов конфигурации, таких как Продвигать.
Я также согласен с тем, что Kohana - это фреймворк, который больше всего похож на RoR в мире PHP. Все, что ему не хватает, - это строительные леса, а с поддержкой CLI в KO3 это просто вопрос, когда кто-то закатывает рукава и делает это.
Вы можете проверить Отдыхать, если вы любите приключения. Как и Выход, он смоделирован на основе Спящий режим.
Он все еще находится на ранней стадии разработки, но пока единственными ограничениями модели предметной области являются то, что классы не помечены как окончательные, а свойства не помечены как частные. Как только я попаду в страну PHP> = 5.3, я также попытаюсь реализовать поддержку частных свойств.
В настоящее время я работаю над phpDataMapper, ORM, разработанным с простым синтаксисом, таким как проект Ruby Datamapper. Он все еще находится на ранней стадии разработки, но отлично работает.
До выпуска PHP 5.3 не ждите хорошей ORM. Это ОО-ограничение PHP.
Так как же PHP 5.3 может помочь кому-нибудь написать лучшую ORM? Я не вижу причин.
Основная причина - введение позднего статического связывания (ключевое слово static). читайте об этом на blog.felho.hu/…
ORM действительно не нужны статические переменные, их можно хорошо спроектировать, используя только переменные экземпляра.
Правда, поздняя статическая привязка - это причина, по которой я могу получить каждый экземпляр ORM моего собственный ORM настолько низкий. До позднего статического связывания это было так же расточительно, как и большинство других.
Дайте шанс dORM, объектно-реляционный преобразователь для PHP 5. Он поддерживает все виды отношений (1-к-1), (1-ко-многим), (многие-ко-многим) и типы данных. Это совершенно ненавязчиво: не требуется генерация кода или расширение класса. На мой взгляд, он превосходит любые существующие ORM, включая Doctrine и Propel. Однако он все еще находится в стадии бета-тестирования и может значительно измениться в ближайшие пару месяцев. http://www.getdorm.com
У него также очень небольшая кривая обучения. Вы будете использовать три основных метода:
<?php
$object = $dorm->getClassName('id_here');
$dorm->save($object);
$dorm->delete($object);
Если вы ищете ORM, например Спящий режим, вам следует взглянуть на PMO.
Его можно легко интегрировать в архитектуру SOA (нужно разработать только класс веб-сервисов).
Попробуйте Красная фасоль, для этого требуется:
Он даже выполняет все блокировки и транзакции за вас, а также отслеживает производительность в фоновом режиме. (Черт возьми! Он даже занимается сборкой мусора ....) Лучше всего ... вам не нужно писать ни одной ... строчки кода ... Господи, это, Слой ORM, спас меня задницу!
Redbean - лучший уровень абстракции базы данных, с которым я когда-либо работал. не «один из лучших» - лучший.
Очень хорошая находка. Я очень впечатлен этим ORM, если не сказать больше
но: stackoverflow.com/questions/3212917/…
Я просто еще не знаю, хорошо ли эта штука работает с существующими базами данных. Особенно, если они связаны отношениями ...
Сравните RedBean с Doctrine: stackoverflow.com/questions/8063640/redbean-vs-doctrine
+1 +1 +1 +! +! !!!! ... Господи, я прочитал первую часть документации, и это заставило меня зловеще рассмеяться, и я уже скачиваю ее!
Я не специалист по PHP, но должен признать, что это выглядит неплохо.
Я действительно не хочу обескураживать, но это идет вразрез со всем, что я знаю - таблицы базы данных должны разрабатываться с осторожностью (для обеспечения производительности) и что вызовы ALTER TABLE дороги (и потенциально опасны).
@NickC Когда вы закончите разработку, базу данных можно «заморозить», чтобы остановить дальнейшие изменения.
Мой друг Кин и я улучшили более раннюю версию ORM, которую он написал до PHP 5.3. По сути, мы перенесли Активная запись Ruby on Rails на PHP. Ему все еще не хватает некоторых ключевых функций, которые нам нужны, таких как транзакции, поддержка составного первичного ключа, еще несколько адаптеров (сейчас работают только MySQL и SQLite 3). Но мы очень близки к завершению этого дела. Вы можете взглянуть на PHP ActiveRecord с PHP 5.3.
Попробуйте PHP ADOdb.
Не могу сказать, что это лучший, потому что я не использовал другие. Но он быстрый, поддерживает Memcached и кеширование.
И это ваааай быстрее, чем Zend Framework's DB / Select.
adodb больше подходит для тонкой модели / Fat Controller, что, как правило, не очень хорошо.
В ADOdb есть ORM (но это не просто ORM). В целом это действительно отличное решение, оно работает намного лучше, чем Zend для БД (а также работает медленнее, чем ADOdb, Zend DB имеет только ограниченную поддержку JOIN), он поддерживает автоматическое экранирование с параметризацией (в отличие от Doctrine) многих различных бэкэндов БД и имеет приятный расширяемый дизайн кеширования с очень простой интеграцией кэша памяти. Я не думаю, что было бы совершенно правильно сказать, что он предоставляет себя реализации «тонкой модели / толстого контроллера» (вы можете сделать это или нет, но дизайн ADOdb не поддерживает тот или иной путь).
PHP ORM Faces для расширения PDO. См. Фреймворк PHP Faces.
$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();
1. Сайт турецкий; 2. Ваш код ничем не отличается от кода, который вы бы использовали, например. Доктрина.
В Фреймворк QCubed есть фантастический ORM; он основан на генерации кода и строительных лесах. В отличие от ActiveRecord, который основан на отражении и обычно работает медленно, генерация кода создает для вас скелетные классы на основе базы данных и позволяет вам настраивать их впоследствии. Работает как часы.
Попробуйте Доктрина2. Это, вероятно, самый мощный инструмент ORM для PHP. Я упоминаю об этом отдельно от Doctrine 1, потому что это совершенно другая программа. Он был переписан с нуля, все еще находится в стадии бета-тестирования, но сейчас его можно использовать и развивать.
Это очень сложная ORM, но хорошо спроектированная. Исчезло много магии из оригинальной Доктрины 1. Он предоставляет полное решение, и вы можете использовать напишите свой собственный ORM поверх Doctrine2 или использовать только один из его слои.
Единственная проблема, о которой я могу думать с Doctrine2, заключается в том, что она зависит от PHP 5.3 и выше.
@jblue: Это не проблема, это особенность ;-). Большие библиотеки, такие как Doctrine, нуждаются в пространствах имен.
«Много магии из оригинальной Доктрины 1 исчезло». - Что в этом хорошего?
Axon ORM является частью Обезжиренный фреймворк - в нем есть средство отображения на лету. Без генераторов кода. Никаких дурацких конфигурационных файлов XML / YAML. Он считывает схему базы данных непосредственно из серверной части, поэтому в большинстве операций CRUD вам даже не нужно расширять базовую модель. Он работает со всеми основными механизмами баз данных, поддерживающими PDO: MySQL, SQLite, SQL Server / Sybase, Oracle, PostgreSQL и т. д.
/* SQL */
CREATE TABLE products (
product_id INTEGER,
description VARCHAR(128),
PRIMARY KEY (product_id)
);
/* PHP */
// Create
$product=new Axon('products'); // Automatically reads the above schema
$product->product_id=123;
$product->description='Sofa bed';
$product->save(); // ORM knows it's a new record
// Retrieve
$product->load('product_id=123');
echo $product->description;
// Update
$product->description='A better sofa bed';
$product->save(); // ORM knows it's an existing record
// Delete
$product->erase();
Прежде всего, подключаемый модуль и сопутствующий ему уровень доступа к данным SQL так же легковесны, как и фреймворк: 14 KB (Axon) + 6 KB (SQLdb). Без жира - всего 55 KB.
Меня всегда беспокоит, когда я вижу в примере что-то вроде $product->load('product_id=123').
для параноиков альтернативный синтаксис - $product->load(array('product_id=:id',array(':id'=>123)));
Fat-Free также имеет ORM NoSQL для MongoDB и плоских файлов.
Я нашел классы, связанные с ORM, в библиотеке PHP Процветать.
Пробовал ORM библиотеки Flourish.
Да, какое-то время работаю с этим. Хорошая библиотека, но над ORM еще есть над чем поработать. Работа с таблицами соединений, которые имеют дополнительные свойства или внешние ключи, создание новых объектов может быть немного утомительным. Работать с простыми моделями очень просто. Взгляните на Repose ORM или Outlet для альтернативного ORM для PHP.
Посмотрите на http://code.google.com/p/lworm/. Это действительно простая, но мощная и легкая ORM-система для PHP. Вы также можете легко расширить его, если хотите.
Действительно хороший простой ORM - это MyActiveRecord. Документация MyActiveRecord. Я много пользовался им и могу сказать, что он очень простой и хорошо протестирован.
Посмотрел Syrius ORM. Это новая ORM, проект находился в стадии разработки, но в ближайшее время выйдет в версии 1.0.
Попробуйте PdoMap. Википедия утверждает, что вдохновлена Hibernate. Поскольку я никогда не использовал Hibernate, я не могу судить :), но я бы сказал по своему опыту, что это хороший и быстрый ORM, который легко реализовать, с менее крутой кривой обучения, чем другие ORM.
Еще один замечательный PHP ORM с открытым исходным кодом, который мы используем, - PHPSmartDb. Он стабилен и делает ваш код более безопасным и чистым. Функциональность базы данных в нем, несомненно, самая простая из тех, что я когда-либо использовал с PHP 5.3.
Садо - это простой пакет PHP ORM, простой в использовании и предлагает видеоуроки.
Если вы ищете ORM, который реализует парадигму Data Mapper, а не конкретно Active Record, то я настоятельно рекомендую вам взглянуть на GacelaPHP.
Особенности Gacela:
Другие решения ORM слишком раздуты или имеют обременительные ограничения при разработке чего-либо отдаленно сложного. Gacela устраняет ограничения активного подхода к записи, реализуя шаблон Data Mapper, сводя к минимуму раздувание, используя PDO для всех взаимодействий с базой данных и Memcached.
У меня большой опыт работы с Идиорма и Париж. Idiorm - это небольшая простая библиотека ORM. Paris - это не менее простая реализация Active Record, построенная на Idiorm. Это для PHP 5.2+ с PDO. Это идеально, если вам нужно что-то простое, что можно просто добавить в существующее приложение.
Бразильский ORM: http://www.hufersil.com.br/lumine. Работает с PHP 5.2+. На мой взгляд, это лучший выбор для португальцев и бразильцев, потому что в нем есть легкая для понимания документация и множество примеров для загрузки.
Вы должны проверить Идиорма и Париж.
Набор инструментов Agile имеет собственную уникальную реализацию ORM / ActiveRecord и динамический SQL.
Введение: http://agiletoolkit.org/intro/1
Синтаксис (Active Record):
$emp=$this->add('Model_Employee');
$emp['name']='John';
$emp['salary']=500;
$emp->save();
Синтаксис (динамический SQL):
$result = $emp->count()->where('salary','>',400)->getOne();
Хотя динамический SQL и Active Record / ORM можно использовать напрямую, Agile Toolkit дополнительно интегрирует их с пользовательским интерфейсом и jQuery UI. Это похоже на JSF, но написано на чистом PHP.
$this->add('CRUD')->setModel('Employee');
Это отобразит AJAXified CRUD с моделью Employee.
Взгляните на LEAP ORM для Kohana. Он работает с множеством баз данных, включая DB2, Морось, Жар-птица, MariaDB, SQL Server, MySQL, Oracle, PostgreSQL и SQLite. Благодаря простой функции автозагрузки он может работать практически с любым фреймворком PHP. Исходный код находится на GitHub по адресу https://github.com/spadefoot/kohana-orm-leap. Вы можете оформить заказ Учебники LEAP онлайн.
Библиотека ORM работает с нецелочисленными первичными ключами и составными ключами. Соединения управляются через пул соединений с базой данных, и он работает с необработанными SQL-запросами. В ORM даже есть построитель запросов, который упрощает создание операторов SQL.
MicroMVC имеет 13 KB ORM, который полагается только на 8 KB класс базы данных. Он также возвращает все результаты как сами объекты ORM и использует позднее статическое связывание, чтобы избежать встраивания информации о таблице текущего объекта и метаданных в каждый объект. Это приводит к самым дешевым накладным расходам ORM.
Он работает с MySQL, PostgreSQL и SQLite.
include "NotORM.php";
$pdo = new PDO("mysql:dbname=software");
$db = new NotORM($pdo);
$applications = $db->application()
->select("id, title")
->where("web LIKE ?", "http://%")
->order("title")
->limit(10)
;
foreach ($applications as $id => $application) {
echo "$application[title]\n";
}
Работаю на miniOrm. Просто мини-ORM для максимально простого использования объектной модели и уровня абстракции MySQL. Надеюсь, это поможет вам: http://jelnivo.fr/miniOrm/
Propel довольно хорош по стандартам php. Он создает довольно чистый код, совместимый с IDE с геттерами и сеттерами, и очень чистую систему абстракции критериев для запросов.