- EL CONOCIMIENTO ES Y DEBE SER LIBRE -

miércoles, diciembre 09, 2009

Modelando con Doctrine Parte I

Si tenemos una Base de Datos relacional ya implementada podemos mapear la DB con Doctrine y empezar a utilizar toda su potencia (para verificar la instalacion de Doctrine dirigete aqui ).El archivo generarModels.php nos permitirá generar el mapeo correspondiente:

/*
Archivo generarModels.php
*/
require_once(dirname(__FILE__) . '/Doctrine-1.2.0/lib/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));

/* Nos conectamos a la DB*/
$dsn = 'mysql:dbname=comercial;host=127.0.0.1';
$user='root';
$password='123456';
/* Conexion a postgre
$dsn = 'pqsql:dbname=comercial;host=127.0.0.1';
$user='postgres';
$password='123456';
*/
$dbh = new PDO($dsn, $user, $password);
$conn = Doctrine_Manager::connection($dbh);
/* Metodo que nos genera los modelos */
Doctrine_Core::generateModelsFromDb('carpetaDeModelos');


Enseguida procedemos a ejecutar el archivo generarModels.php (http://localhost/generarModels.php) y tendremos en la carpeta "carpetaDeModelos" los modelos para empezar a probar Doctrine.
Ahora procedemos a modificar el archivo bootstrap.php y creamos el archivo dqlTestDoctrine.php. Por Favor, antes de ejecutar dqlTestDoctrine.php dirígete a la clase generada y añade require_once según corresponda, en mi caso, quedo así:


/**
* Cliente
*
* This class has been auto-generated by the Doctrine ORM Framework
*
* @package    ##PACKAGE##
* @subpackage ##SUBPACKAGE##
* @author     ##NAME## <##EMAIL##>
* @version    SVN: $Id: Builder.php 6820 2009-11-30 17:27:49Z jwage $
*/
require_once('generated/BaseCliente.php');
class Cliente extends BaseCliente {  }  


/*
Archivo dqlTestDoctrine.php
*/
require_once('bootstrap.php')/*extremadamente importante*/
$q=Doctrine_Query::create()
->select('u.*')   /*todos los campos*/
->from('Cliente  u'); /*selecionamos la clase Cliente*/

print_r($q->execute()->toArray()); /*nos muestra el resultado como un array*/


/*
Archivo bootstrap.php
*/
require_once(dirname(__FILE__) . '/Doctrine-1.2.0/lib/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'))

Doctrine::loadModels('carpetaDeModelos');

$dsn = 'mysql:dbname=comercial;host=127.0.0.1';
$user='root';
$password='123456';

$dbh = new PDO($dsn, $user, $password);
$conn = Doctrine_Manager::connection($dbh);


En mi particular experiencia esta ingeniería inversa tiene algunos inconveniente(por lo menos en postgreSQL) que son los siguientes:
  1. Cuando se encuentran claves primarias compuestas el modelo generado solo mapea una clave primaria, entonces hay que modificar a mano en el modelo generado colocando como clave primaria la clave que obvio Doctrine.
  2. Si están trabajando con PosgreSql y estas utilizando esquemas entonces tendrás que modificar en el modelo generado el nombre de la tabla mapeada anteponiendo el nombre del esquema.

Lo anteriormente mencionado no significa que Doctrine tenga bugs, lo que ocurre es que Doctrine esta optimizado para crear el modelo (que cuenta con relaciones de mucho a muchos, uno a mucho y uno a uno, entre otros elementos adicionales) y a partir del modelo crear la BD (Mysql, PostgreSql, Oracle, SqlServer, etc.)

En el siguiente post crearemos un modelo y empezaremos a utilizar DQL(Doctrine Query Language)





1 comentario:

FA dijo...

hola me sirvio mucho tu post, ya tengo el doctrine instalado,ahora me hace falta aprender a usarlo jejejeje besos!!!!!