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


268

Чи є хороша об'єктно-реляційна бібліотека для відображення PHP?

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

Відповіді:



103

Спробуйте RedBean , для цього потрібно:

  • Немає конфігурації
  • Немає бази даних (вона створює все на льоту)
  • Немає моделей
  • тощо.

Він навіть робить усі блокування та транзакції для вас та відстежує ефективність у фоновому режимі. (Чорт! Це навіть збирає сміття ....) Найкраще ... вам не потрібно писати жодного ... рядка коду ... Ісусе це , шар ORM , врятував мені дупу!


9
redbean - це найкращий шар абстракції бази даних, з яким я коли-небудь працював. не "один з кращих" - найкращий.
Нір Гавіш

Дуже приємна знахідка. Я дуже вражений цим ОРМ, якщо не сказати
Крістофер Таркіні


1
Порівняти RedBean з доктриною: stackoverflow.com/questions/8063640/redbean-vs-doctrine
PiTheNumber

3
+1 +1 +1 +! +! !!!! ... Ісусе, я прочитав першу частину документації, і це змусило мене зловісний сміх диктатора, і я вже завантажую її!
KJW

45

Є лише два хороших: Вчення і Пропель . Ми віддаємо перевагу доктрині, і вона добре працює з Symfony . Однак якщо ви шукаєте підтримку бази даних, крім основної, вам доведеться написати власний код.


Пропель досить хороший за стандартами php. Він створює досить чистий код, що відповідає IDE для геттерів і сетерів, і дуже чиста система абстрагування критеріїв для запитів.
0x6A75616E

Оскільки це питання досить сильно пов'язане з SO, я хотів би зазначити, що Propel є припиненим проектом станом на 2020 рік. Сумісність PHP7 так і не була реалізована. Тож вибір Propel як ОРМ для нового програмного проекту у 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')на прикладі.
Znarkus

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


1
Я шукав легку реалізацію PHP ORM сьогодні і знайшов Pork.dbObject завдяки цій публікації. Це чудово працює! +1
E Домінік

6
Дуде! Це досить цікаво. Я бачу, що останнє оновлення сталося десь у09 році. Це все ще зберігається? Якщо ні ... Я просто можу відродити це :)
VladFr

22

Спробуйте Doctrine2 . Це, мабуть, найпотужніший інструмент ORM для PHP. Я згадую його окремо від Доктрини 1, оскільки це зовсім інший фрагмент програмного забезпечення. Він був переписаний з нуля, все ще знаходиться в бета-фазі, але він зараз корисний і розвинений.

Це дуже складна ORM, але добре розроблена. Багато магії з оригінальної доктрини 1 зникло. Це забезпечує повне рішення, і ви можете написати власний ORM поверх Doctrine2 або використовувати лише один з його шарів .


Єдина проблема, яку я можу думати про Doctrine2 - це те, що це залежить від PHP 5.3 і вище.
jblue

8
@jblue: Це не проблема, це особливість ;-). Великим бібліотекам, як Doctrine, потрібні простори імен.
Том Пажурек

"Багато магії з оригінальної доктрини 1 зникло". - У чому це позитив?
Олів'є 'Ельбаум' Шерлер

13

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


Я також погоджуюся, що Кохана - це структура, найбільш схожа на RoR у світі PHP. Все, чого йому не вистачає, - це ліси, а при підтримці CLI в KO3 - справа лише в тому, щоб хтось засунув рукави і зробив це.
Філіп Уілан

12

Ознайомтеся з аутлетом ORM . Це простіше, ніж пропель і доктрина, і він працює аналогічно режиму сплячки, лише при більшому відчутті PHP.


3
Я спробував це. Мені довелося вказати однакові властивості об'єкта в 3 місцях - конфігурацію, модель та схему бази даних. Це багато роботи для впровадження ІМО ORM.
mixdev

Розетка дуже конфігураційна.
Lotus Notes

Я спробував це (1.0 RC1), і це було дуже баггі навіть в основній функціональності. І так, конфігурації для написання багато. Я не рекомендую.
Szymon Wygnański

11

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

Вам потрібно лише встановити робочу PHP5 та Phing, щоб почати генерувати класи.


Propel також може «інвертувати інженер» існуючу схему бази даних - створюючи PHP-об’єкти, читаючи схему бази даних.
Девід Гудвін



6

Зробіть знімок на dORM, об'єктному реляційному мапі для PHP 5 . Він підтримує всілякі відносини (1-до-1), (1-до-багатьох), (багато-багато-багато) та типи даних. Це абсолютно ненав'язливо: не потрібно створювати код або розширювати клас. На мій погляд, він перевершує будь-яку ОРМ, включаючи Доктрину та Пропель. Однак він все ще знаходиться в бета-версії і може суттєво змінитися в найближчі пару місяців. http://www.getdorm.com

Він також має дуже малу криву навчання. Три основні методи, якими ви користуєтесь:

<?php 
$object = $dorm->getClassName('id_here');
$dorm->save($object);
$dorm->delete($object);

4

В даний час я працюю над phpDataMapper , який є ORM, призначений для простого синтаксису, як проект Ruby's Datamapper. Це ще в ранньому розвитку, але це чудово працює.


4

Я мав чудовий досвід з Ідіормом та Парижем . Idiorm - це невелика, проста ORM-бібліотека. Париж - це однаково проста реалізація Active Record, побудована на Idiorm. Це для PHP 5.2+ із PDO. Це ідеально, якщо ви хочете щось просте, що ви можете просто запустити в існуючий додаток.


4

Спробував бібліотеку ORM Flourish .


Так, я працюю з цим вже деякий час. Мухоморка чудова, але ОРМ ще має певну роботу. Робота з таблицями приєднання, які мають додаткові властивості або зовнішні ключі, створення нових об’єктів може бути трохи стомлюючою. Робота з простими моделями - це легкий вітер. Перегляньте Repose ORM або Outlet для альтернативної ORM для PHP.
Майкл

3

До випуску PHP 5.3 не очікуйте, що буде хороший ORM. Це OO обмеження PHP.


Так як PHP 5.3 допоможе комусь написати кращу ORM? Я не бачу причин.
Ionuț G. Stan Stan

8
основна причина - введення пізнього статичного зв’язування ("статичне" ключове слово). читайте про це на blog.felho.hu/…
knoopx

2
ORM насправді не потребують статичних змінних, вони можуть бути спроектовані лише за допомогою змінних екземплярів.
Том Пажорек,

Правда, пізня статична прив'язка є причиною того, що я можу зробити так, щоб кожен екземпляр ORM власного ORM був таким низьким . До пізнього статичного зв’язування це було так само марно, як і більшість інших.
Xeoncross

3

Ми з моїм другом Кіен вдосконалювались на попередній версії ORM, яку він написав до PHP 5.3. Ми по суті перенесли Ruby on Active Record на Rails на PHP. Ще не вистачає деяких ключових функцій, які ми хочемо, таких як транзакції, складна підтримка первинного ключа, ще кілька адаптерів (зараз працюють лише MySQL та SQLite 3). Але ми дуже близькі до завершення цього матеріалу. Ви можете подивитися PHP ActiveRecord з PHP 5.3 .


3

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

Я не можу сказати, що це найкраще, тому що я не використовував інших. Але це швидко, він підтримує Memcached та кешування.

І це швидше, ніж DB / Select Zend Framework .


2
adodb більше піддається аромату Thin Model / Fat Controller, що, як правило, не є гарною справою.
jblue

ADOdb має ORM (але це не лише ORM). Це, як правило, чудове рішення, воно працює набагато краще, ніж Zend робить для БД (а також повільніше, ніж ADOdb, Zend DB має лише обмежену підтримку JOIN), він підтримує автоматичне уникнення параметризації (на відміну від доктрини) безлічі різних БД і має приємний дизайн кешування з надзвичайно простою інтеграцією memcache. Я не вважаю, що це зовсім точно, якщо говорити, що вона дає можливість реалізувати реалізацію "тонкої моделі / жирового контролера" (ви можете це зробити чи ні, але дизайн ADOdb не сприяє тому чи іншому способу).
Ієн Коллінз

3

Погляньте на LEAP ORM для Kohana . Вона працює з низкою баз даних, включаючи 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

Ви можете перевірити укіс , якщо ви відчуваєте пригоди. Як і Outlet , він моделюється після сплячки .

Це ще дуже рано в його розробці, але поки що єдиними обмеженнями доменної моделі є те, що класи не позначаються остаточними та властивості не позначаються приватними. Як тільки я потрапляю в країну PHP> = 5.3, я спробую реалізувати підтримку і для приватних ресурсів.


2

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

Особливості Gacela:

  • Мап даних
  • Картографування зовнішніх ключів
  • Картографування асоціацій
  • Залежне відображення
  • Успадкування конкретної таблиці
  • Об'єкт запиту
  • Зображення метаданих
  • Ледачий і нетерплячий завантаження
  • Повна підтримка Memcached

Інші рішення ORM занадто роздуті або мають обтяжливі обмеження при розробці будь-якого віддаленого ускладнення. Gacela вирішує обмеження підходу до активного запису, впроваджуючи шаблон Map Mapper, зводячи мінімум до мінімуму, використовуючи PDO для всіх взаємодій з базою даних та Memcached.


2

MicroMVC має 13 КБ ORM, який покладається лише на 8 КБ класу баз даних . Він також повертає всі результати як самі об'єкти ORM і використовує пізні статичні прив'язки, щоб уникнути вбудовування інформації про таблицю та метадані поточного об'єкта в кожен об'єкт. Це призводить до найдешевших витрат на ORM.

Він працює з MySQL , PostgreSQL та SQLite .


2

Бразильська ОРМ: 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";
}

2

PHP ORM Face для розширення PDO. Див. PHP Faces Framework .

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

1. Сайт турецький; 2. Ваш код не відрізняється від коду, яким ви користуєтесь, наприклад, доктриною.
The Pellmeister

1

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


1

Ще один чудовий відкритий код PHP ORM, який ми використовуємо, це PHPSmartDb . Він стабільний і робить ваш код більш безпечним і чистим. Функціонал бази даних всередині нього - це найпростіший, що я коли-небудь використовував із PHP 5.3.


1

Вчення - це, мабуть, найкраща ставка. До Доктрини DB_DataObject була по суті єдиною іншою утилітою, яка була відкритою.


1

Якщо ви шукаєте ORM, наприклад, в сплячку , вам слід ознайомитись з PMO .

Його можна легко інтегрувати в архітектуру SOA (для розробки є лише клас веб-сервісів).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.