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

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

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

Стоит ли изучать 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 и хотите разрабатывать...
267
0
326 215
36

Ответы 36

Загляните в Доктрина.

Доктрина 1.2 реализует Active Record. Доктрина 2+ - ORM DataMapper.

Также проверьте Xyster. Он основан на шаблоне Data Mapper.

Также обратите внимание на DataMapper против Active Record.

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

Propel довольно хорош по стандартам php. Он создает довольно чистый код, совместимый с IDE с геттерами и сеттерами, и очень чистую систему абстракции критериев для запросов.

0x6A75616E 02.09.2011 06:49

Поскольку этот вопрос довольно часто связан с SO, я хотел бы отметить, что Propel является прекращенным проектом с 2020 года. Совместимость с PHP7 так и не была реализована. Поэтому выбор Propel в качестве ORM для нового программного проекта в 2020 году - не лучшая идея.

mrodo 28.02.2020 03:27

Я использую Doctrine несколько лет и ненавижу ее. Не потому, что он не работает, а потому, что он сильно раздут, потребляет много памяти, работает медленно и генерирует миллионы запросов к вашей БД при выполнении операций в фоновом режиме. Это работает, не поймите меня неправильно, но вы потратите много времени на изучение этого и его нюансов, которые, честно говоря, очень расстраивают, если у вас есть большие зависимые наборы данных. Doctrine, без сомнения, широко используется, но если бы я выбрал ORM сегодня, Doctrine НЕ была бы моим первым выбором или даже вторым ... JM5C.

WebTigers 02.09.2020 18:07

@mrodo Propel не прекращена. Propel версии 2 все еще находится в активной разработке для PHP 7.2 и выше.

bigtunacan 02.12.2020 09:07

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

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

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

Propel также может «реконструировать» существующую схему базы данных, создавая объекты PHP на основе чтения схемы базы данных.

David Goodwin 05.07.2011 14:17

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

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

Взгляните: Pork.dbObject

Сегодня я искал легкую реализацию PHP ORM и благодаря этому сообщению нашел Pork.dbObject. Отлично работает! +1

E Dominique 14.04.2009 21:21

Дууд! Это довольно интересно. Я вижу, что последнее обновление произошло где-то в 2009 году. Это все еще сохраняется? Если нет ... я бы мог его оживить :)

VladFr 06.12.2010 17:22

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

Я пробовал это. Мне пришлось указать одни и те же свойства объекта в трех местах - конфигурации, модели и схеме базы данных. Это большая работа для внедрения ORM IMO.

mixdev 16.06.2010 03:32

Розетка очень тяжеловесна.

Lotus Notes 16.07.2011 03:12

Я пробовал это (1.0 RC1), и он был очень глючным даже в основных функциях. И да, нужно написать много настроек. Не рекомендую.

Szymon Wygnański 09.08.2011 23:54

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

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

Phillip Whelan 27.05.2011 07:53

Вы можете проверить Отдыхать, если вы любите приключения. Как и Выход, он смоделирован на основе Спящий режим.

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

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

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

Так как же PHP 5.3 может помочь кому-нибудь написать лучшую ORM? Я не вижу причин.

Ionuț G. Stan 01.03.2009 15:11

Основная причина - введение позднего статического связывания (ключевое слово static). читайте об этом на blog.felho.hu/…

knoopx 07.03.2009 14:51

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

Tom Pažourek 24.07.2010 01:55

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

Xeoncross 24.02.2012 02:29

Дайте шанс 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 - лучший уровень абстракции базы данных, с которым я когда-либо работал. не «один из лучших» - лучший.

Nir Gavish 15.02.2010 21:15

Очень хорошая находка. Я очень впечатлен этим ORM, если не сказать больше

Christopher Tarquini 18.05.2010 12:15

но: stackoverflow.com/questions/3212917/…

Sirber 02.08.2010 19:19

Я просто еще не знаю, хорошо ли эта штука работает с существующими базами данных. Особенно, если они связаны отношениями ...

sinni800 01.08.2011 13:53

Сравните RedBean с Doctrine: stackoverflow.com/questions/8063640/redbean-vs-doctrine

PiTheNumber 17.11.2011 13:44

+1 +1 +1 +! +! !!!! ... Господи, я прочитал первую часть документации, и это заставило меня зловеще рассмеяться, и я уже скачиваю ее!

KJW 27.03.2012 07:09

Я не специалист по PHP, но должен признать, что это выглядит неплохо.

NotMe 26.04.2012 06:48

Я действительно не хочу обескураживать, но это идет вразрез со всем, что я знаю - таблицы базы данных должны разрабатываться с осторожностью (для обеспечения производительности) и что вызовы ALTER TABLE дороги (и потенциально опасны).

Nicole 21.06.2012 07:18

@NickC Когда вы закончите разработку, базу данных можно «заморозить», чтобы остановить дальнейшие изменения.

Sam 11.08.2012 11:40

Мой друг Кин и я улучшили более раннюю версию 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, что, как правило, не очень хорошо.

jblue 20.09.2010 14:14

В ADOdb есть ORM (но это не просто ORM). В целом это действительно отличное решение, оно работает намного лучше, чем Zend для БД (а также работает медленнее, чем ADOdb, Zend DB имеет только ограниченную поддержку JOIN), он поддерживает автоматическое экранирование с параметризацией (в отличие от Doctrine) многих различных бэкэндов БД и имеет приятный расширяемый дизайн кеширования с очень простой интеграцией кэша памяти. Я не думаю, что было бы совершенно правильно сказать, что он предоставляет себя реализации «тонкой модели / толстого контроллера» (вы можете сделать это или нет, но дизайн ADOdb не поддерживает тот или иной путь).

Iain Collins 06.05.2012 20:40

PHP ORM Faces для расширения PDO. См. Фреймворк PHP Faces.

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();

1. Сайт турецкий; 2. Ваш код ничем не отличается от кода, который вы бы использовали, например. Доктрина.

The Pellmeister 10.01.2011 19:04

В Фреймворк QCubed есть фантастический ORM; он основан на генерации кода и строительных лесах. В отличие от ActiveRecord, который основан на отражении и обычно работает медленно, генерация кода создает для вас скелетные классы на основе базы данных и позволяет вам настраивать их впоследствии. Работает как часы.

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

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

Единственная проблема, о которой я могу думать с Doctrine2, заключается в том, что она зависит от PHP 5.3 и выше.

jblue 20.09.2010 14:16

@jblue: Это не проблема, это особенность ;-). Большие библиотеки, такие как Doctrine, нуждаются в пространствах имен.

Tom Pažourek 21.09.2010 17:33

«Много магии из оригинальной Доктрины 1 исчезло». - Что в этом хорошего?

Olivier 'Ölbaum' Scherler 08.09.2011 12:30

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').

Znarkus 11.04.2011 14:57

для параноиков альтернативный синтаксис - $product->load(array('product_id=:id',array(':id'=>123)));

bcosca 11.04.2011 21:45

Fat-Free также имеет ORM NoSQL для MongoDB и плоских файлов.

bcosca 29.12.2011 05:24

Я нашел классы, связанные с ORM, в библиотеке PHP Процветать.

Пробовал ORM библиотеки Flourish.

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

Michael 12.10.2010 15:10

Посмотрите на 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:

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

Другие решения 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.

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";
}

Работаю на miniOrm. Просто мини-ORM для максимально простого использования объектной модели и уровня абстракции MySQL. Надеюсь, это поможет вам: http://jelnivo.fr/miniOrm/

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