Sitio web no optimizado para IE 6

Doctrine Vs Propel

posteado por Emiliano, categoría Php

19 ene
2010

Comparación de los dos ORMs más conocidos y utilizados.

En este post trataremos de hacer una buena comparación sobre los dos ORM para PHP más conocidos, con lo cual, los desarrolladores que tengan que tomar una decisión sobre que ORM utilizar en sus proyectos sea la que más se adapte a sus necesidades.

Los dos ORM para PHP más utilizados son sin lugar a dudas y como el título lo dice Doctrine y Propel.

Características

Ambos ORMs tienen bastantes características básicas similares, ya que soportan cualquier operación usual en un CRUD (Create, Retrieve, Update and Delete), ya sea desde crear un nuevo registro o actualizar los registros existentes. Además, los dos pueden generar las clases PHP del modelo por vos, Propel basado en XML y Doctrine basado en YAML, y ambos soportan la generación de sus respectivos markups desde una base de datos existente. También, ambos soportan varios motores de bases de datos.

Los dos soportan validación de data en los modelos y relaciones entre modelos. Además, soportan herencia simple, aunque en Doctrine es conocida como una herencia concreta. Doctrine soporta otros dos tipos de herencia: Simple, donde todas las clases tienen las mismas columnas, y la herencia de agregación, donde almacena un valor adicional en la tabla, permitiendo la instanciación automática del tipo de modelo correcto cuando se realiza una query.

Bien, hasta ahora hemos visto que comparten casi todas las mismas características, pero las siguientes son solo características que Doctrine tiene.

Behaviors: Doctrine soporta la aplicación de varios "behaviors" a tus modelos, por ejemplo un modelo Timestampable automáticamente creará 2 columnas: created_at y updated_at, las cuales guardarán la fecha cuando un registro es creado y cuando un registro es actulizado respectivamente.

Searching: Doctrine tiene un motor de búsqueda fulltext.

Además, Doctrine soporta Data fixtures y migraciones, caching, events, pagination, command line interface... con lo que podriamos decir que en estas características avanzadas Doctrine supera a Propel.

Usabilidad

Documentación

Una de las cuestiones más importantes por supuesto es la documentación. Sin una buena documentación se hace dificil utilizar cualquier librería. Hasta el año pasado, la documentación de Propel era uno de sus principales problemas, y si bien han ido mejorándola aún le falta. Por el contrario, el equipo de Doctrine ha estado mejorando constantemente su ya superior documentación, y están trabajando en la creación de un libro. En cuanto a documentación es una clara victoria para Doctrine.

Usando las librerías

La primera tarea que tendrás con ambos ORMs será la de crear las clases del modelo. Doctrine te permite escribir un simple archivo YAML, o bien, código PHP si lo prefieres. Si usas YAML, Doctrine tiene algunos métodos que puedes llamar en tu propio código, o puedes descargar una interface de línea de comandos para contruir tus modelos. La propuesta de Propel para crear modelos requiere escribir un XML, y además para construir tus modelos desde el XML, necesitas Phing. Personalmente, encuentro más difícil escribir XML que YAML, por eso prefiero escribir YAML.

Operaciones con la base de datos

Las operaciones básicas de un CRUD son bastante similares en ambos ORMs. Sin embargo, existe una gran diferencia en la manera en que las queries más precisas son hechas.

Propel utiliza una propuesta Criteria/Peer:

<?php
  $c = new Criteria();
  $c->add(UserPeer::ID, 10);

  //SELECT all "User" models which have 10 as their ID and join all foreign tables.
  $users = UserPeer::doSelectJoinFoobar($c); ?>

La propuesta de Doctrine es usar Doctrine_Query y un lenguaje SQL personalizado llamado DQL (Doctrine Query Languaje):

<?php
  $items = Doctrine_Query::create()
    ->from('User u')
    ->leftJoin('u.Foobar')
    ->where('u.id = ?', 10)
    ->execute(); ?>

Setear valores en las clases del modelo es un poco diferente para estos ORMs: Doctrine utiliza propiedades mágicas, mientras que Propel genera métodos para setear y obtener valores (setters y getters). Esta última característica le da a Propel la ventaja de la autocompletación en la mayoría de los IDE's (hasta donde yo se, solo la última versión de NetBeans puede autocompletar las propiedades mágicas de Doctrine gracias al soporte de la anotación @property de PHPDoc).

 

Como conclusión puedo decir que ambos ORMs son muy buenos, pero yo prefiero Doctrine ya que para mi es el mejor de los dos. Tiene mejor documentación, mejores características, y la comunidad está activa. Propel sigue creciendo, pero Doctrine crece mucho más rápido.

Acá también les dejo una comparación realizada por Symfony sobre estos 2 ORMs.

 

Fuente: Codeutopia

Compártelo: technorati Doctrine Vs Propel digg Doctrine Vs Propel facebook Doctrine Vs Propel google Doctrine Vs Propel linkedin Doctrine Vs Propel

17 Comentarios:


yoelvis:

09 de Febrero de 2010 a las 20:31:19

creo que doctrine es muy buen orm pero quisiera saber si existe documentacion en español que uno pueda consultar. saludos.

hasheado:

10 de Febrero de 2010 a las 00:58:39

Hola yoelvis, que yo sepa aún no existe documentación en español para Doctrine. no me he puesto a buscar ya que estoy acostumbrado a leer en inglés pero estoy casi seguro de que no hay nada de documentación o tutoriales en inglés. Saludos

yoelvis:

17 de Febrero de 2010 a las 03:27:44

Alguien me pudiera dar un concepto solido de lo que es DQL

hasheado:

17 de Febrero de 2010 a las 03:45:14

DQL (Doctrine Query Language) es el lenguaje que utiliza Doctrine para ejecutar sus consultas, por ejemplo una consulta DQL seria: $q = Doctrine_Query::create()->from('User u')->leftJoin('u.Phonenumbers p'); lo que se traduciria en la siguiente consulta SQL: SELECT u.id AS u__id, u.is_active AS u__is_active, u.is_super_admin AS u__is_super_admin, u.first_name AS u__first_name, u.last_name AS u__last_name, u.username AS u__username, u.password AS u__password, u.type AS u__type, u.created_at AS u__created_at, u.updated_at AS u__updated_at, p.id AS p__id, p.user_id AS p__user_id, p.phonenumber AS p__phonenumber FROM user u LEFT JOIN phonenumber p ON u.id = p.user_id Hechale una mirada a la documentación de Doctrine -> http://www.doctrine-project.org/documentation/manual/1_0/nl/dql-doctrine-query-language

yoelvis:

22 de Marzo de 2010 a las 20:50:45

quisiera que me pusiera un ejemplo de como realizar una relacion de generalizacion /especializacion por ejemplo de la tabla colaborador relacionarlas con colaborador Salud y colaborador no Salud

yoelvis:

23 de Marzo de 2010 a las 01:06:26

estoy haciendo la tesis y realizando el esquema tengo que realizar una relacion de generalizacion/especializacion y no se como relacionarlas en el esquema yml.

hasheado:

23 de Marzo de 2010 a las 13:10:37

@yoelvis te mande una respuesta a tu email. Saludos.!!

yoelvis:

02 de Abril de 2010 a las 21:24:46

por favor necesito que alguien me explique como realizar una relacion de herencia donde lo unico que tengas las clases hijas sea la llave primaria del padre y los atributos propios de ella.ya que la herencia simple y concreta las clases hijas heredan todos los atributos de la clase padre.

hasheado:

03 de Abril de 2010 a las 17:12:16

@yoelvis: Ninguna de los 3 tipos de herencia soportados por Doctrine (Simple, Concreta, Column Aggregation) hacen eso yoelvis, Doctrine 1.x esta bastante verde en cuanto a herencia, he leído que Doctrine 2 mejorará mucho esto. Yo ye sugeriría o que te adaptes a alguno de los 3 tipos de herencia de Doctrine o que definas tu propias reglas de herencia manualmente. Saludos

yoelvis:

04 de Mayo de 2010 a las 15:36:35

hola como puedo poner un atributo autoincrement sin que sea llave primaria.No se si habra alguna forma de declararlo sin que sea llave primaria

willyhunting:

23 de Mayo de 2010 a las 23:22:45

Se ha abierto un proyecto para traducir la documentación de la versión 1.2 (la última estable a fecha de hoy) Doctrine al castellano en: apsolutions.es/docs Se necesitan colaboradores.

alsalomon:

24 de Julio de 2010 a las 03:03:18

Hola, quisiera saber, cual es la traduccion a doctrine de una linea de codigo como la que sigue: $c->add(tablaPeer::campoTabla, tablaPeer::campoTabla.'>= 10', Criteria::CUSTOM);

rowgm:

09 de Noviembre de 2011 a las 19:32:07

¿Cuál es más rápido? Doctrine 2 es más veloz que Doctrine 1. ¿Pero comparado con Propel? Gracias!

rowgm:

09 de Noviembre de 2011 a las 19:40:09

Mmmm... me respondo yo mismo. Muy interesante esto: http://code.google.com/p/php-orm-benchmark/

Auth:

30 de Diciembre de 2012 a las 00:55:31

Nada, toca esperar enocntes Un detalle, bfEs posible configurar las fotos para que cuando se lee el blog desde el google Reader las fotos se redimensionen a la anchura del lector? Que las fotos que subes, al ser tan grandes, aparecen cortadas por la mitad, y hay que meterse en la direccif3n del blog para poder verlas completas (Con el consiguiente gasto de ancho de banda)Saludos!

oxfnuapobwp:

31 de Diciembre de 2012 a las 14:09:36

u7xaDZ , [url=http://helosovqqard.com/]helosovqqard[/url], [link=http://njflfjnlybrp.com/]njflfjnlybrp[/link], http://fqmakdxmvkaz.com/

david:

28 de Junio de 2014 a las 07:37:11

Hola alguine me puede orientar o pasarme un enlace donde pueda ver un ejemplo de como configurar o instalar doctrine en un webhost por ejemplo godaddy gracias

Comentar este Artículo






Captcha ImageReload_original