Хорошая PHP ORM библиотека?

268

Есть ли хорошая библиотека объектно-реляционного отображения для PHP?

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

Peter Mortensen
источник

Ответы:

103

Попробуйте RedBean , он требует:

  • Нет конфигурации
  • Нет базы данных (она создает все на лету)
  • Нет моделей
  • и т.п.

Он даже делает все блокировки и транзакции для вас и отслеживает производительность в фоновом режиме. (Heck! Это даже делает вывоз мусора ....) Лучше всего ... Вы не должны написать один ... строки кода ... Иисус это , ORM слой , спас меня задница!

jnewman
источник
9
redbean - лучший слой абстракции базы данных, с которым я когда-либо работал. не "один из лучших" - лучший.
Нир Гавиш
Очень хорошая находка. Я очень впечатлен этим ORM, чтобы сказать наименее
Кристофер Тарквини
1
Сравните RedBean с Doctrine: stackoverflow.com/questions/8063640/redbean-vs-doctrine
PiTheNumber
3
+1 +1 +1 +! +! !!!! ... Иисус, я прочитал первую часть документации, и это заставило меня сделать зловещий смех диктатора, и я уже загружаю это!
KJW
45

Есть только два хороших: доктрина и пропел . Мы одобряем Доктрину, и она хорошо работает с Symfony . Однако, если вы ищете поддержку баз данных, кроме основных, вам придется написать свой собственный код.

Peter Mortensen
источник
Propel довольно хорош по стандартам php. Он генерирует довольно чистый код, совместимый с IDE, с геттерами и сеттерами и очень чистой системой абстракций Criteria для запросов.
0x6A75616E
Поскольку этот вопрос довольно тесно связан с SO, я хотел бы отметить, что Propel является прекращенным проектом с 2020 года. Совместимость с PHP7 так и не была реализована. Поэтому не стоит выбирать Propel в качестве ORM для нового программного проекта в 2020 году.
mrodo
34

Axon ORM является частью Fat-Free Framework - он имеет картограф на лету. Нет генераторов кода. Нет глупых файлов конфигурации 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 КБ (Axon) + 6 КБ (SQLdb). Без жира всего 55 КБ.

еще
источник
15
Меня всегда беспокоит, когда я вижу что-то вроде $product->load('product_id=123')примера.
Знаркус
9
для параноиков альтернативный синтаксис$product->load(array('product_id=:id',array(':id'=>123)));
bcosca
4
У Fat-Free также есть NoSQL ORM для MongoDB и плоских файлов
bcosca
28

Я разрабатывал Pork.dbObject самостоятельно. (Простая реализация PHP ORM и Active Record). Основная причина в том, что большинство ORM мне кажутся слишком тяжелыми.

Основная идея Pork.dbObejct - быть легким и простым в настройке. Нет группы файлов XML, только один вызов функции в конструкторе, чтобы связать его, и addRelation или addCustomRelation, чтобы определить отношение к другому dbObject.

Дайте ему посмотреть: Pork.dbObject

SchizoDuckie
источник
1
Сегодня я искал легкую реализацию PHP ORM и нашел Pork.dbObject благодаря этому посту. Работает отлично! +1
E Доминик
6
Duude! Это довольно интересно. Я вижу, что последнее обновление произошло где-то в '09. Это все еще поддерживается? Если нет ... Я просто мог бы оживить это :)
VladFr
22

Попробуйте Doctrine2 . Это, вероятно, самый мощный инструмент ORM для PHP. Я упоминаю об этом отдельно от Doctrine 1, потому что это совершенно другое программное обеспечение. Он был переписан с нуля, все еще находится на стадии бета-тестирования, но теперь он пригоден для использования и разработан.

Это очень сложный ORM, но хорошо продуманный. Много магии из оригинальной Доктрины 1 исчезло. Он предоставляет полное решение, и вы можете написать свой собственный ORM поверх Doctrine2 или использовать только один из его слоев .

Томп
источник
Единственная проблема, которую я могу придумать с Doctrine2, заключается в том, что он зависит от PHP 5.3 и выше.
jblue
8
@jblue: Это не проблема, это особенность ;-). Большие библиотеки, такие как Doctrine, нуждаются в пространствах имен.
Том Пажурек
«Много магии из оригинальной Доктрины 1 исчезло». - В чем этот позитив?
Оливье Ольбаум Шерлер
13

Я только начал с Kohana , и он кажется наиболее близким к Ruby on Rails, не задействуя всю сложность нескольких конфигурационных файлов, как с Propel .

Зак
источник
Я также согласен с тем, что Kohana - это фреймворк, наиболее похожий на RoR в мире PHP. Все, чего ему не хватает, это строительные леса, и с поддержкой CLI в KO3 это просто вопрос того, как кто-то закатывает рукава и делает это.
Филлип Уилан
12

Проверьте аутлет ORM . Он проще, чем Propel и Doctrine, и работает аналогично Hibernate, только с большей чувствительностью к PHP.

Alvaro
источник
3
Я попробовал это. Пришлось указывать одни и те же свойства объекта в 3 местах - конфиг, модель и схема базы данных. Это большая работа по внедрению ORM IMO.
mixdev
Розетка очень тяжелая.
Lotus Notes
Я пробовал это (1.0 RC1), и это было очень глючно даже в основной функциональности. И да, есть много конфигурации для записи. Я не рекомендую это.
Szymon Wygnański
11

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

Вам нужна только рабочая установка PHP5 и Phing, чтобы начать создавать классы.

CMS
источник
Propel также может «перепроектировать» существующую схему базы данных - создавая объекты PHP из чтения схемы базы данных.
Дэвид Гудвин
8

Я нашел связанные с ORM классы в библиотеке PHP Flourish .

VDVLeon
источник
6

Дать шанс 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);
Оливье Лалонд
источник
4

В настоящее время я работаю над phpDataMapper , который представляет собой ORM, разработанный для простого синтаксиса, подобный проекту Datamapper в Ruby. Он все еще находится на ранней стадии разработки, но прекрасно работает.

Ванс Лукас
источник
4

У меня был большой опыт с Идиормом и Парижем . Idiorm - это небольшая простая библиотека ORM. Paris - это одинаково простая реализация Active Record, построенная на Idiorm. Это для PHP 5.2+ с PDO. Это прекрасно, если вы хотите что-то простое, что вы можете просто вставить в существующее приложение.

Сандер Марешаль
источник
4

Попробовал ОРМ библиотеки Процветания .

eaguilar
источник
Да, я работал с этим в течение некоторого времени. Flourishlib великолепен, но ORM еще есть над чем поработать. Работа с таблицами соединений, которые имеют дополнительные свойства или внешние ключи, создание новых объектов может быть немного утомительным. Работать с простыми моделями очень просто. Взгляните на Repose ORM или Outlet для альтернативного ORM для PHP.
Майкл
3

До выхода PHP 5.3 не ожидайте хорошего ORM. Это ОО ограничение PHP.

knoopx
источник
Итак, как PHP 5.3 поможет кому-то написать лучшую ORM? Я не вижу никакой причины.
Ionuț G. Stan
8
основная причина - введение позднего статического связывания (ключевое слово «static»). об этом читайте на blog.felho.hu/...
knoopx
2
ORM на самом деле не нужны статические переменные, они могут быть хорошо спроектированы с использованием только переменных экземпляра.
Том Пажурек
Правда, позднее статическое связывание - причина, по которой я могу получить каждый экземпляр ORM своего собственного ORM так низко . До позднего статического связывания это было так же расточительно, как и большинство других.
Xeoncross
3

Мой друг Кин и я улучшили более раннюю версию ORM, которую он написал до PHP 5.3. По сути, мы перенесли активную запись Ruby on Rails на PHP. В нем по-прежнему отсутствуют некоторые ключевые функции, которые нам нужны, такие как транзакции, поддержка составного первичного ключа, несколько дополнительных адаптеров (сейчас работают только MySQL и SQLite 3). Но мы очень близки к тому, чтобы закончить это дело. Вы можете взглянуть на PHP ActiveRecord с PHP 5.3 .

Jacques Fuentes
источник
3

Попробуйте PHP ADOdb.

Я не могу сказать, что это лучшее, потому что я не использовал другие. Но это быстро, он поддерживает Memcached и кеширование.

И это намного быстрее, чем в Zend Framework DB / Select.

Peter Mortensen
источник
2
adodb больше подходит для вкуса Thin Model / Fat Controller, что, как правило, не очень хорошо.
jblue
ADOdb имеет ORM (но не просто ORM). Как правило, это действительно отличное решение, оно работает намного лучше, чем Zend для БД (и, будучи более медленным, чем ADOdb, Zend DB имеет только ограниченную поддержку JOIN), оно поддерживает автоматическое экранирование с параметризацией (в отличие от, скажем, Doctrine) многих различных бэкэндов БД и имеет хороший расширяемый дизайн кэширования с супер легкой интеграцией с memcache. Я не думаю, что было бы совершенно точно сказать, что он поддается реализации «Тонкая модель / Fat Controller» (вы можете сделать это или нет, но дизайн ADOdb не одобряет так или иначе).
Иэн Коллинз
3

Посмотрите на LEAP ORM для Кохана . Он работает со множеством баз данных, включая DB2 , Drizzle , Firebird , MariaDB , SQL Server, MySQL , Oracle, PostgreSQL и SQLite . С помощью простой функции автозагрузки он может работать практически с любым фреймворком PHP. Исходный код находится на GitHub по адресу https://github.com/spadefoot/kohana-orm-leap . Вы можете проверить учебники LEAP онлайн.

Библиотека ORM работает с нецелыми первичными ключами и составными ключами. Соединения управляются через пул соединений с базой данных, и он работает с необработанными SQL-запросами. ORM даже имеет построитель запросов, который делает построение операторов SQL очень простым.

Мэтью
источник
2

Вы можете проверить Repose, если вы чувствуете себя предприимчивым. Как и Outlet , он смоделирован после Hibernate .

Он все еще находится на очень ранней стадии разработки, но пока единственными ограничениями в модели предметной области являются то, что классы не помечены как окончательные, а свойства не помечены как частные. Как только я попаду в страну PHP> = 5.3, я попытаюсь реализовать поддержку частных свойств.

Бо Сименсен
источник
2

Если вы ищете ORM, который реализует парадигму Data Mapper, а не Active Record, то я настоятельно рекомендую вам взглянуть на GacelaPHP .

Особенности Gacela:

  • Картограф данных
  • Отображение внешнего ключа
  • Сопоставление ассоциаций
  • Зависимое отображение
  • Наследование бетонных столов
  • Объект запроса
  • Отображение метаданных
  • Ленивая и энергичная загрузка
  • Полная поддержка Memcached

Другие решения ORM слишком раздуты или имеют обременительные ограничения при разработке чего-либо удаленно сложного. Gacela устраняет ограничения подхода активной записи, внедряя шаблон отображения данных, сохраняя при этом раздутость до минимума, используя PDO для всех взаимодействий с базой данных и Memcached.

Noah Goodrich
источник
2

MicroMVC имеет 13 КБ ORM, который опирается только на класс базы данных 8 КБ . Он также возвращает все результаты в виде самих объектов ORM и использует позднюю статическую привязку, чтобы избежать встраивания информации о таблице текущего объекта и метаданных в каждый объект. Это приводит к самым низким накладным расходам ORM.

Он работает с MySQL , PostgreSQL и SQLite .

Peter Mortensen
источник
2

Бразильский ORM: http://www.hufersil.com.br/lumine . Работает с PHP 5.2+. На мой взгляд, это лучший выбор для португальцев и бразильцев, потому что он имеет простую для понимания документацию и множество примеров для скачивания.

Пауло Араужо
источник
2

Agile Toolkit имеет собственную уникальную реализацию ORM / ActiveRecord и динамический SQL .

Введение: http://agiletoolkit.org/intro/1

Синтаксис (активная запись):

$emp=$this->add('Model_Employee');
$emp['name']='John';
$emp['salary']=500;
$emp->save();

Синтаксис (динамический SQL):

$result = $emp->count()->where('salary','>',400)->getOne();

Хотя Dynamic SQL и Active Record / ORM можно использовать напрямую, Agile Toolkit дополнительно интегрирует их с пользовательским интерфейсом и пользовательским интерфейсом jQuery . Это похоже на JSF, но написано на чистом PHP.

$this->add('CRUD')->setModel('Employee');

Это отобразит AJAXified CRUD с моделью сотрудника.

романиньш
источник
2

NotORM

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";
}
Charlie Chai
источник
2

PHP ORM Faces Для расширения PDO. Смотрите PHP Faces Framework .

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();
Курт
источник
1. Сайт турецкий; 2. Ваш код ничем не отличается от кода, который вы бы использовали, например, с Doctrine.
Пеллмейстер
1

Посмотрите на http://code.google.com/p/lworm/ . Это действительно простая, но мощная и легкая система ORM для PHP. Вы также можете легко расширить его, если хотите.

Faz
источник
1

Еще один отличный PHP ORM с открытым исходным кодом, который мы используем, это PHPSmartDb . Он стабилен и делает ваш код более безопасным и чистым. Функциональность базы данных в ней - самая простая, которую я когда-либо использовал с PHP 5.3.

Джо
источник
1

Доктрина - это, вероятно, ваш лучший выбор. До Доктрины DB_DataObject был, по сути, единственной другой утилитой с открытым исходным кодом.

Анон
источник
1

Если вы ищете ORM, например, Hibernate , вы должны взглянуть на PMO .

Он может быть легко интегрирован в архитектуру SOA (существует только класс веб-сервиса).

аноним
источник