2008-09-20 34 views
269

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

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

Respuesta

45

Hay solo 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.

+0

Propel también funciona bien con Symfony, incluido Symfony2. – analytik

+0

Propel es bastante bueno para los estándares php. Produce un código bastante limpio que es IDE amigable con getters y setters y un sistema de abstracción Criteria muy limpio para consultas. – SuitedSloth

1

Doctrine es probablemente su mejor opción. Antes de Doctrine, DB_DataObject era esencialmente la única otra utilidad que tenía un origen abierto.

+3

Información incorrecta – Berming

11

Me gusta mucho Propel, here puede obtener una visión general, el documentation es bastante bueno, y puede obtenerlo a través de PEAR o SVN.

Solo necesita una instalación de PHP5 en funcionamiento, y Phing para comenzar a generar clases.

+0

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 la base de datos. –

28

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

El pensamiento 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 vincularla, y una addRelation o addCustomRelation para definir una relación con otro dbObject.

darle un aspecto: Pork.dbObject

+1

Estaba buscando una implementación ligera de PHP ORM hoy, y encontré Pork.dbObject gracias a esta publicación. ¡Funciona genial! +1 –

+5

Duude! Esto es bastante interesante. Veo que la última actualización ocurrió en algún lugar en '09. ¿Esto todavía se mantiene? Si no ... podría revivirlo :) – VladFr

12

Salida Outlet ORM. Es más simple que Propel y Doctrine y funciona de manera similar a Hibernate, solo que tiene más de PHP.

+3

Intenté esto. Tuve que especificar las mismas propiedades del objeto en 3 lugares: configuración, modelo y esquema de la base de datos. Eso es mucho trabajo para implementar un ORM IMO. – mixdev

+0

El tomacorriente tiene mucha configuración. –

+0

He intentado esto (1.0 RC1) y fue muy defectuoso incluso en la funcionalidad básica. Y sí, hay mucha configuración para escribir. No lo recomiendo –

12

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.

+0

También estoy de acuerdo en que Kohana es el marco que es más similar a RoR en el mundo de PHP. Lo único que falta es el andamiaje, y con el soporte CLI en KO3 es solo cuestión de que alguien se arremangue y lo haga. –

2

Puede consultar Repose si se siente aventurero. Como Outlet, se modela después 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 se marcan como definitivas y las propiedades no se marcan como privadas. Una vez que entre en la tierra de PHP> = 5.3, intentaré implementar soporte para propiedades privadas también.

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.

3

Hasta la liberación de PHP 5.3 no se espera tener un buen ORM. Es una limitación OO de PHP.

+0

Entonces, ¿cómo ayudaría PHP 5.3 a alguien a escribir un mejor ORM? No veo ninguna razón. –

+8

el motivo principal es la introducción del enlace estático tardío (palabra clave "estática"). lee sobre esto en http://blog.felho.hu/what-is-new-in-php-53-part-2-late-static-binding.html – knoopx

+2

ORM realmente no necesita variables estáticas, pueden ser bien diseñado utilizando solo variables de instancia. –

6

Dale una oportunidad al dORM, an object relational mapper for PHP 5. Es compatible con 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 o ampliación de clase. En mi opinión, es superior a cualquier ORM que exista, Doctrine y Propel incluidos. Sin embargo, todavía está en versión beta y podría cambiar significativamente en los próximos meses. http://www.getdorm.com

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

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

¿el enlace está roto? – Mel

1

Si usted está buscando un ORM, como Hibernate, usted debe tener vistazo a PMO.

Se puede integrar fácilmente en una arquitectura SOA (solo se desarrolla una clase de servicio web).

98

Try RedBean, su requiere:

  • ninguna configuración
  • Ninguna base de datos (que crea todo sobre la marcha)
  • No hay modelos
  • etc.

Incluso hace todo el bloqueo y las transacciones para usted y supervisa el rendimiento en segundo plano. (¡Diablos !, incluso hace recolección de basura ...) Lo mejor de todo ... no tienes que escribir una sola ... línea de código ... Jesús this, ORM layer, me salvó el culo!

+8

redbean es sin dudas la mejor capa de abstracción de base de datos con la que he trabajado. no "uno de los mejores" - el mejor. –

+0

Muy buen hallazgo. Estoy muy impresionado con este ORM por decir lo menos –

+6

pero: http://stackoverflow.com/questions/3212917/redbean-o-rm-store-date-as-varchar255 – Sirber

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 migrado a través de Ruby en Rails 'Active Record a PHP. Aún faltan algunas funciones clave que queremos, como transacciones, compatibilidad con claves primarias compuestas, 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 with PHP 5.3.

3

Probar PHP ADOdb.

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

Y es waaaay más rápido que Zend Framework's DB/Select.

+2

adodb se presta más al sabor Thin Model/Fat Controller, que generalmente no es algo bueno. – jblue

+3

ADOdb es un DAL, no un ORM –

+0

ADOdb tiene un ORM (pero no es solo un ORM). En general, es una gran solución, funciona mucho mejor que Zend para DB (además de ser más lenta que ADOdb, Zend DB tiene soporte limitado para JOIN), admite el escapado automático con parametrización (a diferencia de decir Doctrine) muchos backends DB diferentes y tiene un buen diseño de caché extensible con una integración de Memcache muy fácil. No creo que sea del todo correcto decir que se presta a una implementación de "Modelo delgado/Controlador de grasa" (puede hacerlo o no, pero el diseño de ADOdb no favorece a uno u otro). –

2

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

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

1. El sitio es turco; 2. Su código no es diferente del código que usaría con, por ejemplo, Doctrina. –

1

Hay un ORM fantástico incluido en el QCubed framework; se basa en la generación de código y el andamiaje. A diferencia de ActiveRecord, que se basa en la reflexión y generalmente es lento, la generación de código crea clases básicas para usted en función de la base de datos y le permite personalizarlas posteriormente. Funciona a las mil maravillas.

+0

esto se asemeja a la forma en que funciona yii – sivann

22

Probar Doctrine2. Probablemente sea 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 1 original desapareció. Proporciona una solución completa, y puede write your own ORM on top of Doctrine2 o usar solo uno de sus layers.

+0

El único problema que se me ocurre con Doctrine2 es que depende de PHP 5.3 y posteriores. – jblue

+8

@jblue: no es un problema, es una característica ;-). Grandes bibliotecas como Doctrine necesitan espacios de nombres. –

+0

"La gran cantidad de magia de Doctrine 1 original desapareció". ¿En qué sentido es positivo? –

33

Axon ORM es parte del Fat-Free Framework - tiene un asignador sobre la marcha. Sin generadores de código. No hay archivos de configuración estúpidos XML/YAML. Lee el esquema de la base de datos directamente desde el servidor, 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 PDO que reciben apoyo de base de datos: 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(); 

Por encima de todo, la capa de acceso de datos SQL plug-in y el acompañamiento son tan ligeros como el marco: 14   KB (Axon) + 6   KB (SQLdb). Fat-Free es solo 55   KB.

+13

Siempre me preocupa cuando veo algo como '$ product-> load ('product_id = 123')' en un ejemplo. – Znarkus

+8

para paranoicos, la sintaxis alternativa es '$ product-> load (array ('product_id =: id', array (': id' => 123)));' – stillstanding

+4

Fat-Free también tiene ORM NoSQL para MongoDB y plano archivos – stillstanding

8

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

4
+0

Sí, he estado trabajando con esto por algún tiempo. El flourishlib es genial, pero el ORM todavía tiene algo que hacer. Al trabajar con tablas de combinación que tienen propiedades adicionales o claves externas, crear objetos nuevos 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

1

Mirado en Syrius ORM. Es un nuevo ORM, el proyecto estaba en una etapa de desarrollo, pero en la próxima boca se lanzará en una versión 1.0.

1

Probar PdoMap. Wikipedia afirma que está inspirado en Hibernate. Como nunca utilicé Hibernate, no puedo juzgar :), pero desde mi experiencia, diría que es un ORM bueno y rápido que es fácil de implementar, con una curva de aprendizaje menos pronunciada que otros ORM.

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 la más fácil que he usado con PHP 5.3.

1

Sado es un simple paquete ORM PHP, fácil de usar, y ofrece tutoriales en vídeo

2

Si usted está buscando un ORM que implementa el paradigma de Datos Mapper en lugar de Active Record específicamente, entonces fuertemente sugeriría que se échele un vistazo al GacelaPHP.

Gacela características:

  • asignador de datos
  • Exteriores asignación de teclas
  • Asociación mapeo
  • mapeo dependiente
  • herencia concreta de
  • objeto Query
  • mapeo de metadatos
  • Lazy & carga ansiosa
  • completa Memcached apoyo

Otras soluciones ORM son demasiado hinchado o tener limitaciones onerosas en el desarrollo de cualquier cosa remotamente complicado. Gacela resuelve las limitaciones del enfoque de registro activo implementando el Patrón del asignador de datos mientras mantiene el inflado al mínimo usando PDO para todas las interacciones con la base de datos y Memcached.

3

He tenido grandes experiencias con Idiorm and Paris. Idiorm es una pequeña y simple biblioteca ORM. París es una implementación igualmente simple de Active Record desarrollada en Idiorm. Es para PHP 5.2+ con PDO. Es perfecto si quieres algo simple que puedas incluir en una aplicación existente.

2

ORM de Brasil: http://www.hufersil.com.br/lumine. Funciona con PHP 5.2+. En mi opinión, es la mejor opción para las personas portuguesas y brasileñas, ya que tiene documentación fácil de entender y muchos ejemplos para descargar.

2

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

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

Sintaxis (Active Record):

$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 SQL dinámico y activo de grabación/ORM es utilizable directamente, ágil Toolkit los integra con la interfaz de usuario y jQuery UI. Esto es similar a JSF pero escrito en PHP puro.

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

Esto mostrará Ajaxified CRUD por empleado modelo.

3

Eche un vistazo a LEAP ORM for Kohana. Funciona con varias bases de datos, incluidos DB2, Drizzle, Firebird, MariaDB, SQL   Servidor, 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. Puede pagar LEAP's tutorials 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 conexión de base de datos y funciona con consultas SQL sin formato. El ORM incluso tiene un generador de consultas que hace que crear sentencias SQL sea súper simple.

2

MicroMVC tiene un 13   KB ORM que sólo se basa en un 8 KB   database class. 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 y metadatos del objeto actual en cada objeto. Esto da como resultado la sobrecarga de ORM más barata que existe.

Funciona con MySQL, PostgreSQL y SQLite.

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

trabajo en miniOrm. Solo un mini ORM, para usar Object Model & MySQL Abstraction Layer de la manera más sencilla posible. Espero que pueda ayudarlo: http://jelnivo.fr/miniOrm/

Cuestiones relacionadas