ORM PHP

mapeo objeto-relacional (más conocido por su nombre en inglés, Object-Relational mapping, o sus siglas O/RM, ORM, y O/R 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 el utilizado en una base de datos relacional. En la práctica esto crea una base de datos orientada a objetos virtual, por sobre la base de datos relacional. Esto posibilita el uso de las caracterí­sticas propias de la orientación a objetos (básicamente herencia y polimorfismo). Hay paquetes comerciales y de uso libre disponibles que desarrollan el mapeo relacional de objetos, aunque algunos programadores prefieren crear sus propias herramientas ORM. (Fuente Wikipedia)

Propongo el siguiente ejemplo:

  1. Una Persona tiene una o mas fotos (hasMany).
  2. Una Foto tiene asociada una Persona (belongsTo)

En codigo para guardar la asociacion serí­a:

$arreglo['Persona']['nombre'] = "Fabian";
$arreglo['Persona'][]['Fotos']['nombre'] = "Bailando.jpg";
$arreglo['Persona'][]['Fotos']['nombre'] = "Cantando.jpg";
$objeto->guardar($arreglo);

Deseo ahora updatear:

$arreglo['Persona']['id'] = 1;
$arreglo['Persona']['nombre'] = "Fabian Ramirez";
$objeto->guardar($arreglo);

Y mas aun borrar:

$objeto->borrar(1);

Y leer:

$objeto->read(1);

 Lo cual me retornaria un arreglo asi:

  $arreglo['Persona']['nombre'] = "Fabian Ramirez"
  $arreglo['Persona'][0]['Fotos']['nombre'] = "Bailando.jpg";
  $arreglo['Persona'][1]['Fotos']['nombre'] = "Saltando.jpg";

Y si leyera la foto me retornaria:

$arreglo['Fotos']['nombre'] = "Bailando.jpg";
$arreglo['Fotos']['Persona']['nombre'] = "Fabian Ramirez";


¿Deseas tener ORM (Object Relational Mapping) sin usar un framework complejo para tus proyectos?

Aquí­ te dejo una lista con los frameworks ya incorporados que puedes utilizar:

Yo personalmente use Propel para un pequeño desarrollo y me trajo MUY buenos resultados.

¿ Tu cual usas ?

No hay Trackbacks

21 Comentarios

  1. CakePHP que tiene su propio ORM. Igualmente hay que tener un poco de cuidado con los ORM, ya que en muchos casos resultan un tanto ineficientes, sobre todo para grandes consultas.

    Muchas veces es por ineficiencia de los usuarios tambien :), por lo que se debe tener cuidado y saber muy bien que es lo que estaba pasando por debajo.

    Comentado 29 julio 2008 a las 14:12 | Permalink
  2. A la moda a la moda.
    Buen ejemplo, similar a los que hace CakePHP. Ahora estoy creando uno propio para la empresa en la que estoy, devolviendo objetos de datos y no arreglos, pero la idea es la misma :D

    Saludos y nos vemos el vierneees!

    Comentado 29 julio 2008 a las 14:21 | Permalink
  3. Para que te devuelva objetos seria:

    $objeto = $objeto->read(1);

    echo “Mi nombre es ” . (string)$objeto->nombre . ” y apellido ” . (string)$objeto->apellido;

    A la moda a la moda

    Comentado 29 julio 2008 a las 14:50 | Permalink
  4. Para guardar

    $persona = new Persona(“Fabian”,”Ramirez”);
    $objeto->save($persona);

    Saludos

    Comentado 29 julio 2008 a las 15:03 | Permalink
  5. Mas o menos asi, como lo planteas, pero con get y set (son los requerimientos que la empresa pide :P)

    $persona = $object->read(1);

    echo “Mi Nombre es ” . $persona->getNombre() . ” y mi novio se llama ” . $persona->Novia->getNombre() . “”;

    Y para guardar algo similiar

    $data->setNombre(‘Victor’);
    $data->Novia->setNombre(‘Elizabeth’);
    $persona->save($data);

    Saludos

    Comentado 29 julio 2008 a las 15:07 | Permalink
  6. No es “novio” es “novia” :D para que no se preste para malos entendidos jajajaja

    Comentado 29 julio 2008 a las 15:07 | Permalink
  7. Eso se llama accesadores y modificaciones .. se parece a cuando trabajaba Java sin Hibernate :)

    Saludos

    Comentado 29 julio 2008 a las 15:16 | Permalink
  8. claro. Asi mismito mijo.

    Comentado 29 julio 2008 a las 16:29 | Permalink
  9. Es preferible en cualquier caso el uso de un array asociativo como DTO

    Comentado 29 julio 2008 a las 17:18 | Permalink
  10. Correcto, pero mucha influencia java hace que pidan esas cosas…

    De todas formas ya tengo todo solucionado por detras para manejar los datos a nivel de sistema como arreglos y a nivel de aplicacion como objetos.

    Comentado 29 julio 2008 a las 17:45 | Permalink
  11. Lo malo es que el argumento más fuerte a favor de los accesors/mutators es que permiten un control, a nivel de lógica de negocio, del contenido del DTO, cuando por definición un DTO es un objeto para transporta data, independiente del contexto en que estos objetos se utilicen y por lo tanto NO deben contener lógica, para eso existen otras capas.

    Comentado 29 julio 2008 a las 17:49 | Permalink
  12. Justamente Pablo y de acuerdo contigo .. pero anda a quitarle de la cabeza a una persona que modela UML lo que estamos hablando .. siempre para cada propiedad de una clase .. hay un accesador y modificador …

    :(

    Comentado 29 julio 2008 a las 18:00 | Permalink
  13. Leito

    Pablo: esta bien lo que dices de los DTO, pero en este caso se esta hablando de ORM, en donde, si bien no creo que corresponda tener lógica de negocios dentro de un getter/setter, estaría bien tener minima funcionalidad como validaciones, encriptadores o lo que se te ocurra.

    De todas formas, coincido con Favicon en que el uso “obligatorio” de getters/setters es una herencia de Java sin mucho fundamento en aplicaciones de mediana envergadura.

    Comentado 29 julio 2008 a las 18:06 | Permalink
  14. Concuerdo en lo que dice Pablo, pero asi son los requerimientos.

    Aunque en si, el objeto de datos no da muchas funcionalidades solo get y set (en mi caso obviamente).

    Saludos

    Comentado 29 julio 2008 a las 18:36 | Permalink
  15. Leito:

    Lo que mencionas de las validaciones, encriptaciones, etc, no corresponde a la capa de transporte (DTO) sino al modelo, DAO, o como quieras llamarlo. Por ejemplo si hubiera que hacer una validación debería ser en el save(), o en algún metodo similar, porque eventualmente yo querría utilizar el DTO en forma incompleta (por ejemplo en el caso de un usuario, si el proceso de creación se hiciera por pasos)

    Saludos,

    Comentado 29 julio 2008 a las 19:02 | Permalink
  16. @Victor: tamos de acuerdo :)

    Comentado 29 julio 2008 a las 19:02 | Permalink
  17. Muy cierto Pablo lo que dices …

    Feliz con el resultado que dio todo esto .. ayudo a todos.

    Saludos

    Comentado 29 julio 2008 a las 19:24 | Permalink
  18. Obviamente que ayudo a todos, buenisimo el post y la discusión que se dio muy buena.

    Saludos

    PD: Ahora a mi objeto de datos le agregué dos métodos mas, toArray() y toObject() que me simplificaron un poco mas la vida.

    Comentado 29 julio 2008 a las 23:38 | Permalink
  19. Carlos

    Es posible autogenerar las clases con cakephp sin necesidad de mapear todo paso a paso ?

    Comentado 23 abril 2009 a las 2:17 | Permalink
  20. Terence Omalley

    I agree, he has developed a presence and his passing is much improved.

    Comentado 26 julio 2012 a las 22:01 | Permalink
  21. Virgil Enyeart

    Don’t be afraid to call it an 8 win or even a 9 win season ..

    Comentado 30 julio 2012 a las 22:36 | Permalink

dokshor.com (RSS) + Sator-ii theme by Felipe Lavín and finally edited by dokshor.

hacker emblem