Qué es Doctrine ORM?

Qué es un ORM?

Un ORM o (Object Relation Mapper) es una técnica de programación que nos permite convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en una base de datos relacional, es decir, las tablas de nuestra base de datos pasan a ser clases y los registros objetos que podemos manejar con facilidad.

fig02

Utilizar un ORM tiene una serie de ventajas que nos facilitan enormemente tareas comúnes y de mantenimiento:

  1. Reutilización: La principal ventaja que aporta un ORM es la reutilización permitiendo llamar a los métodos de un objeto de datos desde distintas partes de la aplicación e incluso desde diferentes aplicaciones.
  2. Encapsulación: La capa ORM encapsula la lógica de los datos pudiendo hacer cambios que afectan a toda la aplicación únicamente modificando una función.
  3. Portabilidad: Utilizar una capa de abstracción nos permite cambiar en mitad de un proyecto de una base de datos MySQL a una Oracle sin ningún tipo de complicación. Esto es debido a que no utilizamos una sintaxis MySQL, Oracle o SQLite para acceder a nuestro modelo, sino una sintaxis propia del ORM utilizado que es capaz de traducir a diferentes tipos de bases de datos.
  4. Seguridad: Los ORM suelen implementar mecanísmos de seguridad que protegen nuestra aplicación de los ataques más comúnes como SQL Injections.
  5. Mantenimiento del código: Gracias a la correcta ordenación de la capa de datos, modificar y mantener nuestro código es una tarea sencilla.

Qué es Doctrine?

doctrine-logoSegún la documentación oficial, Doctrine es un ORM para PHP 5.2.3 y posterior. Además de todas las ventajas que conlleva un ORM, uno de sus puntos fuertes es su lenguaje DQL (Doctrine Query Language) inspirado en el HQL de Hibernate.

Cuando trabajamos con Doctrine, necesitamos informar a su motor interno de cual es el modelo de nuestra aplicación, para ello podemos hacer ingeniería inversa de nuestra base de datos existente, o si empezamos la aplicación desde 0, crear el modelo en la sintaxis específica que nos propone Doctrine y luego generar toda la base de datos.

Para crear el modelo, doctrine nos da dos alternativas, hacer una clase por tabla e indicarle mediante PHP el tipo de datos que almacenaremos en él, un ejemplo:

// models/generated/BaseUser.php

class User extends BaseUser
{
    public function setTableDefinition()
    {
        $this->hasColumn('username', 'string', 255, array('default' => 'default username'));
        $this->hasColumn('name', 'string', 255, array('default' => 'default name'));
        $this->hasColumn('age', 'integer', 4, array('unsigned' => true));
        // ...
    }

    // ...
}

O crear un esquema en formato YAML (schema.yml) similar a XML, pero bastante más legible. El equivalente al ejemplo anterior en YAML sería:

# schema.yml

# ...
User:
# ...
  columns:
    username:
      type: string(255)
      default: default username
    name:
      type: string(255)
      default: default name
    age:
      type: integer(4)
      unsigned: true
    # ...

Además de definir los campos de cada tabla, también le indicamos las relaciones que tienen con las otras tablas y su tipo (many-to-many, one-to-many, one-to-one…), lo que deja perfectamente estructurada nuestro modelo de datos y su manera de acceder a los valores.

Más adelante seguiré escribiendo sobre las ventajas de Doctrine y añadiendo ejemplos que considere interesantes y/o útiles.

9 thoughts on “Qué es Doctrine ORM?

  1. Pingback: Crear una relación many-to-many con Doctrine

  2. Estoy empezando a usar Doctine, y he visto por algún sitio que se pueden definir relaciones M-M, pero yo no las utilizo.

    Tradicionalmente en el modelo relacional, una relación M-M se suele descomponer en una nueva tabla y 2 relaciones 1-M. Así es como siempre lo he hecho, independientemente de usar o no un ORM, por lo que no veo esa necesidad por parte del ORM, aunque como digo, por algún sitio he visto describir relaciones M-M.

  3. Hola Juan,

    Tal y como comenas, las relaciones M-N se suelen hacer con una tabla intermedia y de hecho es lo que hace Doctrine, sin embargo, en lugar de definir tres tablas, como por ejemplo:

    User
    Phone
    User_Phone

    Le indicamos a doctrine que existen las tablas User y Phone y que hay una relación M-N entre ellas, y él se encarga de crear la tabla intermedia User_Phone.

    Doctrine no reinventa la rueda, simplemente nos permite convertir las tablas de nuestra base de datos a clases y los registros a objetos que podemos manejar con facilidad, lo cual es muy útil y cómodo.

    Espero haberte aclarado la duda.

  4. Como crear una relacion de generalizacin especializacion con doctrine.
    Ej Class Colaborador relacionarla con ColaboradorSalud y ColaboradorNoSalud
    Saludos

  5. Solo, una pregunta que plugins usas para colorear la sintaxis, q no encuentro uno asi, y si me pasas un ejemplo mejor.
    gracias

  6. 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.

  7. doctrine es el primer ORM que utilizo y me a parecido bastante potente y deseaba utilizarlo en todos mis proyectos hasta que llegue a la pregunta: como puedo manejar la desnormalizacion. (mal necesario para almacenar datos en el tiempo) por ejemplo: En un sistema donde se tengan productos y facturas en doctrine se generarian 2 entidades: factura y producto y en la base de datos tendria 3 tablas factura, producto y como su relacion en bd es muchos a muchos se generaria una tercera productos_factura. En esta tabla se desnormalizarian los valores de los productos para preseravarlos en el tiempo y no caer en problemas de legalidad, pero hasta donde leido, buscado e intentado no he logrado una correcta materializacion concorde con el modelo que necesito. (les recomiendo tener esto en cuenta antes de iniciar cualquier proyecto)

  8. Hola necesito crear una clase para convertir relaciones en un base de datos a objetos, es decir siguiendo mas menos la mismo politica del orm pero para hacerlo solo con una clase alguien me puede ayudar???? escribir a este correo ailincita123@gmail.com graciassssssssss

Comments are closed.