"El buen diseño es obvio. El gran diseño es transparente"
- Joe Sparano

Doctrine vs Eloquent

5 minutos de lectura
Fecha: 27/3/2018

Voy a intentar explicar un poco las diferencias entre Doctrine y Eloquent, los ORM de los que posiblemente sean los dos frameworks más importantes en la escena PHP, por un lado Symfony (Doctrine) y por otro Laravel (Eloquent).

¿Qué es un ORM?

El mapeo objeto-relacional (más conocido por su nombre en inglés, Object-Relational mapping) es una técnica de programación para convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y la utilización de una base de datos relacional como motor de persistencia.

Por si la explicación de la wikipedia no se entiende del todo un ORM te permite persistir los datos de tus objetos en una base de datos y viceversa, crear objetos con los datos de la base de datos.

Si no usas un ORM seguramente comprendes la complejidad de hacer ese mapeo, pues transformar los datos con los que trabajas en negocio a objetos válidos de la base de datos y al contrario supone mucho esfuerzo.

El ORM lo hace por ti y además como es el encargado de gestionar ese flujo te permite abstraerte de la base de datos de manera que te va a dar igual cual sea su arquitectura, y si en un futuro por ejemplo quisieras migrar de MySql a Oracle, Microsoft SQL o PostgreSQL lo puedes hacer fácilmente.

Además de esto nos proporciona una sintaxis más sencilla a la hora de operar sobre ellas, en definitiva nos ahorra mucho tiempo.

Dentro de los distintos ORM que podemos encontrar, estos dos que estamos hoy comparando son los que, si estás desarrollando en PHP, seguramente acabes usando. Y además son muy distintos.

Eloquent

Eloquent es el ORM oficial del que actualmente es el framework PHP más popular, que es Laravel.

Dentro de las ventajas que tiene Eloquent destaca principalmente que es muy fácil de usar, su sencillez y claridad consigue que aún sin trabajar en el pasado con un ORM en pocas horas puedas familiarizarte con su manera de trabajar y comenzar a desarrollar algo.

Si quieres aprender a usarlo puedes ir a la documentación oficial que te explica como arrancar.

Eloquent sigue el patrón Active Record, por ello destaca en su sencillez, de hecho la primera versión de Doctrine también seguía este patrón.

La gente que lo usa por lo general está encantada y comenta que les gusta trabajar con él, y para la mayoría de tus proyectos Eloquent será más que suficiente para gestionar la comunicación con la base de datos.

Para entender mejor la metodología de el patrón Active Record, esta es la definición.

Una tabla de la base de datos o vista (view) está envuelta en una clase. Por lo tanto, una instancia de un objeto está ligada a un único registro (tupla) en la tabla. Después de crear y grabar un objeto, un nuevo registro es adicionado a la tabla. Cualquier objeto cargado obtiene su información a partir de la base de datos. Cuando un objeto es actualizado, un registro correspondiente en la tabla también es actualizado. Una clase de envoltura implementa los métodos de acceso (setter e getter) o propiedades para cada columna en la tabla o vista.

Por resumirlo. Nosotros creamos nuestra BBDD, en el caso de Laravel usamos ficheros de migraciones, y una vez creada lo que hace Eloquent es proporcionarnos clases para cada una de las tablas las cuales tienen ya la funcionalidad para hacer las operaciones comunes sobre ellas y en las cuales si quisiéramos podríamos implementar métodos para ampliar su funcionalidad.

Al instanciar estas clases estamos operando sobre las tuplas de la tabla, el problema es que como vemos el acoplamiento de estas entidades con el modelo de datos es total.

Entre otros frameworks que usan esta manera de trabajar podemos encontrar Rails, que es uno de los frameworks mejor valorados entre el desarrollo web, que además refleja la filosofía de una comunidad tan importante como es la de Ruby. De manera que Eloquent y el patrón Active Record es una opción muy valida.

Doctrine

El otro ORM en cuestión es Doctrine, y es el oficial del otro framework PHP más conocido, Symphony, el cual además de ser un proyecto más maduro fue el también un importante colaborador para que naciera Laravel, ya que este usa muchas de sus dependencias.

Si con Eloquent tenías mucho ganado por venir de Rails, con Doctrine tendrás mucho ganado si vienes de Hibernate, el famoso ORM de Java, de hecho esta inspirado en él.

La versión actual de Doctrine (la 2.X) cambió su patrón, usa DAO (Data Access Object) y por tanto es un Data Mapper. La ventaja que tiene sobre Active Record es que aun siendo más complicado, también es más versátil y el control que tenemos de la base de datos usando un Data Mapper es mayor.

Antes se mencionaba que el acoplamiento de las clases con nuestras clases de datos era muy grande en Eloquent, en Doctrine es precisamente al contrario, y esa es su mayor fortaleza y lo que le hace versátil.

Por supuesto que para desacoplarlos es necesario incluir una nueva capa de abstracción y una arquitectura mayor es lo que resulta en una mayor complejidad.

Aquí te dejo la documentación oficial para que empieces a ver como se usa.

Resumen

A mi juicio ambas opciones son válidas, y no se trata de que uno sea mejor que otro. Pero si es cierto que según como sea de compleja la lógica de negocio de tu proyecto será mas conveniente uno u otro.

Para la mayoría de los proyectos donde la lógica es sencilla y con operaciones básicas como las de CRUD y poco más somos capaces de trabajar, entonces usa Eloquent, todo te resultará mas sencillo y rápido.

Si por el contrario la complejidad de los modelos de base de datos y tu negocio son grandes vas a necesitar un ORM que te proporcione un mayor control y versatilidad, ahí sería mejor que fueras a Doctrine.