Saltar al contenido

Doctrine Vs Propel

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: http://www.hasheado.com/doctrine-vs-propel.html

Si te ha interesado este artículo y deseas un apoyo o asesoría en algún requerimiento, envíame un mensaje a: (info@juliopari.com) o sino a través de Linkedin: https://www.linkedin.com/in/juliopari/