Lunes, febrero 22nd, 2010

Doctrine ORM: Inicio Rápido

Doctrine es un ORM(object relational mapper) que se ha vuelto muy popular en los últimos meses, la verdad es una herramienta que puede apoyar mucho nuestros desarrollos y es notable la cantidad de desarrolladores de Zend Framework o CodeIgniter que lo están incorporando, si bien, aprender Doctrine no es muy complejo, nunca está de más tener una guía de “Inicio Rápido”, y este post nos muestra de una manera muy sencilla como empezar a usar Doctrine… esta guía considera que Doctrine ya está funcionando en tu proyecto y de alguna manera sus clases están generadas(esto sería el paso 1, si creen que vale la pena podemos hacer un post al respecto)… de cualquier forma todo esto y mas se encuentra en la documentación de Doctrine, la cual esta en su sitio oficial.

Crear una conexión…
Doctrine_Manager::connection( "mysql://user:pass@server/db", 'myconn');
Insertar registros

Objeto Record
Esta es la forma más usada y sencilla. Cuando el método save es llamado el nuevo registro es creado…

$u = new User();
$u->username = 'user';
$u->password = 'pass';
$u->save();



Metodo fromArray()
Existen ocasiones en los cuales los datos ya están en un arreglo.

$data = array(
'username' => 'user',
'password' => 'pass',
'email' => 'mail@mail.com'
);
$u = new User();
$u->fromArray($data);
$u->save();

Método flush() de Doctrine_Connection
Cuando mandas llamar el método Doctrine_Connection::flush(), todos los objetos que no se han guardado se guardaran automáticamente, Doctrine ejecuta esto como una sola transacción.

$u = new User();
$u->username = 'user';
$u->password = 'pass';
$u2 = new User();
$u2->username = 'foo';
$u2->password = 'bar';
$conn = Doctrine_Manager::connection();
$conn->flush();

SQL
También puedes crear una consulta de SQL y usarla a través de el método execute() de la clase Doctrine_Connection. El método execute soporta sustitución de valores usando el caracter ‘?’, y al usar esto automáticamente te proteges de SQL injection.

$data = array('user','pass');
$conn = Doctrine_Manager::connection();
$conn->execute('INSERT INTO user (username, password) VALUES (?,?)',  $data);
Leer registros

Estas operaciones hacen uso frecuente de los objetos Doctrine_Table los cuales pueden ser obtenidos llamando el método Doctrine::getTable() y como parámetro el nombre de la clase modelo, con los ejemplos se entenderá mejor.

Método find()
El método find() hace una búsqueda a partir de la clave primaria de la tabla.

$user_id = 1;
$u = Doctrine::getTable('User')->find($user_id);
echo $u->username;

Método findOneBy*()
Este es un método mágico al cual simplemente se le tiene que apendizar el nombre de la columna y buscara en la tabla a partir de esa columna. Este método solo obtiene un registro. Al usar estos métodos se debe capitalizar la primer letra de el nombre de la columna aunque este escrito con minúsculas…

$username = 'myuser';
$u = Doctrine::getTable('User')->findOneByUsername($username);
echo $u->username;

Método findBy*()
Otro método mágico el cual funciona similar al anterior pero obteniendo múltiples registros.

$users = Doctrine::getTable('User')->findByRole('admin');
echo $users[0]->username;
echo $users[1]->username;

DQL
Doctrine Query Language es una de las características mas fuertes de Doctrine, en este ejemplo crearemos un objeto query y a partir de ahí se irá generando la consulta, este ejemplo es muy básico pero se entenderá fácilmente, después de ejecutar la consulta nos regresara un objeto Doctrine_Collection.

$role = 'admin';
$q = Doctrine_Query::create()
->select('username')
->from('User')
->where('role = ?', $role)
->limit(20);
$users = $q->execute();
echo $users[0]->username;
echo $users[1]->username;

Método toArray()
El objetos Doctrine_Record tiene un método toArray() el cual nos permitirá obtener un arreglo asociativo a partir de un Doctrine_Record…

$user_id = 1;
$u = Doctrine::getTable('User')->find($user_id);
$u_arr = $u->toArray();
print_r($u_arr);
Actualizar registros



Objeto Record
Puedes hacer cualquier cantidad de cambios a un objeto, al llamar el método save() se actualizara en la base de datos…

$user_id = 1;
$u = Doctrine::getTable('User')->find($user_id);
$u->password = 'newpass';
$u->save();

DQL
Cuando quieres actualizar muchos registros a la vez esta es una opción muy recomendada, en este ejemplo el método execute() regresa el numero de registros afectados…

$status = 'active';
$q = Doctrine_Query::create()
->update('User')
->set('status', '?', $status)
->where('id < 5');
$numrows = $q->execute();
echo "$numrows records updated";
Borrar registros

Objeto Record

$user_id = 1;
$u = Doctrine::getTable('User')->find($user_id);
$u->delete();

DQL
Al igual que en la actualización esta es una opción para la eliminación, en este ejemplo el método execute() regresa el numero de registros eliminados…

$q = Doctrine_Query::create()
->delete('User')
->where('id < 5');
$numrows = $q->execute();
echo "$numrows records deleted";

Pues esto es todo por hoy, espero sea de ayuda y les permita comenzar a usar Doctrine aquí nos falto tocar el tema de la configuración de Doctrine pero la verdad es que no es muy complicado, como sea si alguien tiene algún problema no dude en consultar, ojala y pueda ayudarlos… saludos

Compartelo:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Linkter
  • Live
  • MySpace
  • Netvibes
  • Reddit
  • Technorati
  • Bitacoras.com
  • email
  • LinkedIn
  • Meneame
  • Print
  • Socialogs
  • SphereIt
  • StumbleUpon
  • FriendFeed
  • RSS
  • Yahoo! Bookmarks
  • Twitter
  • Add to favorites
  • PDF

Articulos relacionados

4 Comentarios en “Doctrine ORM: Inicio Rápido”


  1. Estoy desarrollando un sitio de gestión de datos donde Doctrine es el ORM utilizado. Necesito saber la sintaxis correcta para la clausula select pues aunque la pongo simpre me devuelve todos los valores de la tabla en cuenstion. Por otro lado me es necesario obtener datos mediante la condicion de un rango de fechas, es doctrine capaz de utilizar between? Como? Gracias.


  2. Saludos Alejandro, el detalle es que te regresan objetos de una clase generada por eso parece que tiene todos los campos de la tabla, pero internamente Doctrine solo llenara el id y los que le pidas (o sea algunos campos estaran vacios), aqui esta la documentacion de ejemplo http://www.doctrine-project.org/projects/orm/1.2/docs/manual/dql-doctrine-query-language/en#select-queries...

    Respecto al BETWEEN, este lo puedes usar con DQL simplemente mete dentro del where lo que quieras por ejemplo:

    $query->where(‘BETWEEN ? AND ?’, valores);

    Espero sea de ayuda…

  3. Geis Garcia

    De antemano felicitarlo por sus conocimientos y preguntarle en que parte miro lo publicado por usted sobre symfony ya que me encuentro haciendo una aplicasion en symfony con php pero estoy es un poco azul ()azul quiere decir que no entiendo casi nada) y me han ayudado pero quiero entenderlo por mi mismo se me ha hecho duro en lo que me puedas ayudar te agradezco


  4. Un saludo Geis, espero que la informacion te sea util, con respecto a lo de symfony, pues lamento decirte que no tengo nada publicado acerca de ese framework en especial, yo trabajo sobre Zend Framework y participo en un proyecto nuevo llamado Model3PHP, sin embargo el uso de los frameworks tiene cierta similitud, si puedo ayudarte en algo, pues tratare…

Déjame tu comentario...