Buena biblioteca PHP ORM?

268

¿Existe una buena biblioteca de mapeo relacional de objetos para PHP?

Sé de PDO / ADO, pero parece que solo proporcionan abstracción de las diferencias entre los proveedores de bases de datos, no un mapeo real entre el modelo de dominio y el modelo relacional. Estoy buscando una biblioteca PHP que funcione de manera similar a como Hibernate lo hace para Java y NHibernate lo hace para .NET.

Peter Mortensen
fuente

Respuestas:

103

Prueba RedBean , requiere:

  • Sin configuración
  • Sin base de datos (crea todo sobre la marcha)
  • No modelos
  • etc.

Incluso realiza todos los bloqueos y transacciones por usted y supervisa el rendimiento en segundo plano. (Diablos, incluso hace la recolección de basura ...) Lo mejor de todo ... no tienes que escribir una sola ... línea de código ... Jesús, esto , capa ORM , me salvó el culo!

jnewman
fuente
9
Redbean es sin duda la mejor capa de abstracción de base de datos con la que he trabajado. no "uno de los mejores", el mejor.
Nir Gavish
Muy buen hallazgo. Estoy muy impresionado con este ORM, por decir lo menos
Christopher Tarquini,
1
Compare RedBean con Doctrine: stackoverflow.com/questions/8063640/redbean-vs-doctrine
PiTheNumber
3
+1 +1 +1 +! +! !!!! ... Jesús, leí la primera parte de la documentación y me hizo reír siniestramente, ¡y ya la estoy descargando!
KJW
45

Solo hay dos buenos: Doctrine y Propel . Estamos a favor de Doctrine, y funciona bien con Symfony . Sin embargo, si está buscando soporte de base de datos además de los principales, tendrá que escribir su propio código.

Peter Mortensen
fuente
Propel es bastante bueno para los estándares de php. Produce un código bastante limpio que es compatible con IDE con getters y setters y un sistema de abstracción de criterios muy limpio para consultas.
0x6A75616E
Como esta pregunta se vincula bastante con SO, quería señalar que Propel es un proyecto descontinuado a partir de 2020. La compatibilidad con PHP7 nunca se implementó. Por lo tanto, elegir Propel como ORM para un nuevo proyecto de software en 2020 no es una buena idea.
mrodo
34

Axon ORM es parte del Marco sin grasas : presenta un mapeador sobre la marcha. No hay generadores de código. No hay archivos estúpidos de configuración XML / YAML . Lee el esquema de la base de datos directamente desde el back-end, por lo que en la mayoría de las operaciones CRUD ni siquiera tiene que extender un modelo base. Funciona con todos los principales motores de bases de datos compatibles con PDO : MySQL , SQLite , SQL Server / Sybase, Oracle, PostgreSQL , etc.

/* 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();

Sobre todo, el complemento y la capa de acceso a datos SQL que lo acompaña son tan livianos como el marco: 14 KB (Axon) + 6 KB (SQLdb). Sin grasa es solo 55 KB.

pendientes
fuente
15
Siempre me preocupa cuando veo algo como $product->load('product_id=123')en un ejemplo.
Znarkus
9
para paranoicos, la sintaxis alternativa es$product->load(array('product_id=:id',array(':id'=>123)));
bcosca
44
Fat-Free también tiene ORM NoSQL para MongoDB y archivos planos
bcosca
28

He estado desarrollando Pork.dbObject por mi cuenta. (Una implementación simple de PHP ORM y Active Record) La razón principal es que encuentro que la mayoría de los ORM son demasiado pesados.

La idea principal de Pork.dbObejct es ser liviano y fácil de configurar. No hay un montón de archivos XML, solo una llamada de función en el constructor para vincularlo, y un addRelation o addCustomRelation para definir una relación con otro dbObject.

Dale un vistazo: Pork.dbObject

SchizoDuckie
fuente
1
Estaba buscando una implementación ligera de PHP ORM hoy, y encontré Pork.dbObject gracias a esta publicación. ¡Funciona muy bien! +1
E Dominique
66
Duude! Esto es muy interesante Veo que la última actualización ocurrió en algún lugar del '09. ¿Esto todavía se mantiene? Si no ... podría revivirlo :)
VladFr
22

Prueba Doctrine2 . Es probablemente la herramienta ORM más poderosa para PHP. Lo menciono por separado de Doctrine 1, porque es una pieza de software completamente diferente. Ha sido reescrito desde cero, todavía está en fase beta, pero ahora se puede usar y desarrollar.

Es un ORM muy complejo, pero bien diseñado. Mucha magia de la Doctrina original 1 desapareció. Proporciona una solución completa, y puede escribir su propio ORM sobre Doctrine2 o usar solo una de sus capas .

tomp
fuente
El único problema que se me ocurre con Doctrine2 es que depende de PHP 5.3 y versiones posteriores.
jblue
8
@jblue: No es un problema, es una característica ;-). Las bibliotecas grandes como Doctrine necesitan espacios de nombres.
Tom Pažourek
"Mucha magia de la Doctrina original 1 desapareció". - ¿En qué sentido es esto positivo?
Olivier 'Ölbaum' Scherler
13

Acabo de comenzar con Kohana , y parece ser el más cercano a Ruby on Rails sin invocar toda la complejidad de múltiples archivos de configuración como con Propel .

Zak
fuente
También estoy de acuerdo en que Kohana es el marco más similar a RoR en el mundo PHP. Todo lo que falta son andamios, y con el soporte de CLI en KO3 es solo cuestión de que alguien se arremangue y lo haga.
Phillip Whelan
12

Echa un vistazo a Outlet ORM . Es más simple que Propel y Doctrine y funciona de manera similar a Hibernate, solo que tiene una sensación de PHP.

Alvaro
fuente
3
Intenté esto Tuve que especificar las mismas propiedades de objeto en 3 lugares: configuración, modelo y esquema de base de datos. Eso es mucho trabajo para implementar una ORM IMO.
mixdev
El tomacorriente tiene mucha configuración.
Lotus Notes
He intentado esto (1.0 RC1) y estaba muy defectuoso incluso en la funcionalidad básica. Y sí, hay mucha configuración para escribir. No lo recomiendo
Szymon Wygnański
11

Realmente me gusta Propel , aquí puedes obtener una visión general, la documentación es bastante buena y puede obtenerla a través de PEAR o SVN.

Solo necesita una instalación PHP5 que funcione y Phing para comenzar a generar clases.

CMS
fuente
Propel también puede "aplicar ingeniería inversa" a un esquema de base de datos existente, creando objetos PHP a partir de la lectura del esquema de base de datos.
David Goodwin
8

Encontré clases relacionadas con ORM en la biblioteca PHP Flourish .

VDVLeon
fuente
6

Dale una oportunidad a dORM, un mapeador relacional de objetos para PHP 5 . Admite todo tipo de relaciones (1 a 1), (1 a muchos), (muchos a muchos) y tipos de datos. Es completamente discreto: no se requiere generación de código ni extensión de clase. En mi opinión, es superior a cualquier ORM, Doctrine y Propel incluidos. Sin embargo, todavía está en beta y podría cambiar significativamente en los próximos dos meses. http://www.getdorm.com

También tiene una curva de aprendizaje muy pequeña. Los tres métodos principales que usará son:

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

Actualmente estoy trabajando en phpDataMapper , que es un ORM diseñado para tener una sintaxis simple como el proyecto Datamapper de Ruby. Todavía está en desarrollo temprano también, pero funciona muy bien.

Vance Lucas
fuente
4

He tenido grandes experiencias con Idiorm y París . Idiorm es una biblioteca ORM pequeña y simple. Paris es una implementación igualmente activa de Active Record basada en Idiorm. Es para PHP 5.2+ con PDO. Es perfecto si desea algo simple que simplemente puede colocar en una aplicación existente.

Sander Marechal
fuente
4

Probé el ORM de la biblioteca Flourish .

eaguilar
fuente
Sí, he estado trabajando con eso por algún tiempo. El flourishlib es excelente, pero el ORM todavía tiene trabajo por hacer. Trabajar con tablas de unión que tienen propiedades adicionales o claves foráneas, crear nuevos objetos puede ser un poco tedioso. Trabajar con modelos simples es muy sencillo. Eche un vistazo a Repose ORM or Outlet para un ORM alternativo para PHP.
Michael
3

Hasta la versión PHP 5.3 no espere tener un buen ORM. Es una limitación OO de PHP.

knoopx
fuente
Entonces, ¿cómo ayudaría PHP 5.3 a alguien a escribir un ORM mejor? No veo ninguna razón
Ionuț G. Stan
8
La razón principal es la introducción del enlace estático tardío (palabra clave "estática"). lea sobre esto en blog.felho.hu/…
knoopx
2
ORM realmente no necesita variables estáticas, pueden estar bien diseñadas usando solo variables de instancia.
Tom Pažourek
Es cierto, el enlace estático tardío es la razón por la que puedo obtener cada instancia de ORM de mi propio ORM tan bajo . Antes del enlace estático tardío, era tan derrochador como la mayoría de los demás.
Xeoncross
3

Mi amigo Kien y yo hemos mejorado una versión anterior de un ORM que había escrito antes de PHP 5.3. Básicamente, hemos trasladado el Registro Activo de Ruby on Rails a PHP. Todavía carece de algunas características clave que queremos, como transacciones, soporte de clave primaria compuesta, algunos adaptadores más (solo MySQL y SQLite 3 funcionan en este momento). Pero, estamos muy cerca de terminar esto. Puede echar un vistazo a PHP ActiveRecord con PHP 5.3 .

Jacques Fuentes
fuente
3

Prueba PHP ADOdb.

No puedo decir que sea lo mejor, porque no he usado los otros. Pero es rápido, es compatible con Memcached y el almacenamiento en caché.

Y es muchísimo más rápido que el DB / Select de Zend Framework .

Peter Mortensen
fuente
2
adodb se presta más al sabor del modelo delgado / controlador de grasa, que generalmente no es algo bueno.
jblue
ADOdb tiene un ORM (pero no es solo un ORM). En general, es una solución realmente excelente, funciona mucho mejor que Zend para DB (además de ser más lento que ADOdb, Zend DB solo tiene soporte de JOIN limitado), admite escapes automáticos con parametrización (a diferencia de Doctrine) muchos backends de DB diferentes y tiene un bonito diseño de almacenamiento en caché extensible con una integración de memcache súper fácil. No creo que sea del todo correcto decir que se presta a una implementación de "Modelo delgado / Controlador de grasa" (puede hacer eso o no, pero el diseño de ADOdb no favorece de una manera u otra).
Iain Collins
3

Echa un vistazo a LEAP ORM para Kohana . Funciona con un montón de bases de datos, que incluyen DB2 , Drizzle , Firebird , MariaDB , SQL Server, MySQL , Oracle, PostgreSQL y SQLite . Con una función de carga automática simple, puede funcionar con casi cualquier marco PHP. El código fuente está en GitHub en https://github.com/spadefoot/kohana-orm-leap . Puedes pagar los tutoriales de LEAP en línea.

La biblioteca ORM funciona con claves primarias no enteras y claves compuestas. Las conexiones se administran a través de un grupo de conexiones de base de datos y funciona con consultas SQL sin procesar. El ORM incluso tiene un generador de consultas que hace que la creación de sentencias SQL sea súper simple.

Matthew
fuente
2

Puede consultar Repose si se siente aventurero. Al igual que Outlet , está modelado a partir de Hibernate .

Todavía es muy temprano en su desarrollo, pero hasta ahora las únicas restricciones en el modelo de dominio son que las clases no están marcadas como finales y las propiedades no están marcadas como privadas. Una vez que llegue a la tierra de PHP> = 5.3, también intentaré implementar el soporte para propiedades privadas.

Beau Simensen
fuente
2

Si está buscando un ORM que implemente el paradigma de Data Mapper en lugar de Active Record específicamente, le sugiero que eche un vistazo a GacelaPHP .

Gacela cuenta con:

  • Mapeador de datos
  • Mapeo de clave foránea
  • Mapeo de asociación
  • Mapeo dependiente
  • Herencia de mesa de hormigón
  • Objeto de consulta
  • Mapeo de metadatos
  • Carga perezosa y ansiosa
  • Completa Memcached apoyo

Otras soluciones ORM están demasiado hinchadas o tienen limitaciones onerosas cuando se desarrolla algo remotamente complicado. Gacela resuelve las limitaciones del enfoque de registro activo mediante la implementación del patrón del mapeador de datos mientras mantiene la hinchazón al mínimo utilizando PDO para todas las interacciones con la base de datos y Memcached.

Noah Goodrich
fuente
2

MicroMVC tiene un ORM de 13 KB que solo se basa en una clase de base de datos de 8 KB . También devuelve todos los resultados como objetos ORM y utiliza el enlace estático tardío para evitar incrustar información sobre la tabla del objeto actual y los metadatos en cada objeto. Esto da como resultado la sobrecarga de ORM más barata que existe.

Funciona con MySQL , PostgreSQL y SQLite .

Peter Mortensen
fuente
2

ORM brasileño: http://www.hufersil.com.br/lumine . Funciona con PHP 5.2+. En mi opinión, es la mejor opción para los portugueses y brasileños, porque tiene documentación fácil de entender y muchos ejemplos para descargar.

Paulo Araujo
fuente
2

Agile Toolkit tiene su propia implementación única de ORM / ActiveRecord y SQL dinámico .

Introducción: http://agiletoolkit.org/intro/1

Sintaxis (registro activo):

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

Sintaxis (SQL dinámico):

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

Mientras que Dynamic SQL y Active Record / ORM se pueden usar directamente, Agile Toolkit los integra aún más con la interfaz de usuario y la interfaz de usuario jQuery . Esto es similar a JSF pero escrito en PHP puro.

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

Esto mostrará CRUD AJAXified con el modelo de Empleado.

romaninsh
fuente
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
fuente
2

Caras PHP ORM para la extensión PDO. Ver PHP Faces Framework .

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();
Kurt
fuente
1. El sitio es turco; 2. Su código no es diferente del código que usaría con, por ejemplo, Doctrine.
The Pellmeister
1

Otro gran ORM PHP de código abierto que usamos es PHPSmartDb . Es estable y hace que su código sea más seguro y limpio. La funcionalidad de la base de datos es sin duda la más fácil que he usado con PHP 5.3.

Joe
fuente
1

La doctrina es probablemente tu mejor apuesta. Antes de Doctrine, DB_DataObject era esencialmente la única otra utilidad de código abierto.

anon
fuente
1

Si está buscando un ORM, como Hibernate , debería haber mirado PMO .

Se puede integrar fácilmente en una arquitectura SOA (solo hay una clase de servicio web para desarrollar).

anónimo
fuente