El tutorial Jobeet

3.4. El ORM

Gracias a la descripción de las tablas y columnas de la base de datos en el archivo schema.yml, podemos hacer uso de algunas tareas incluidas en Propel para generar automáticamente las sentencias SQL necesarias para crear todas las tablas de la base de datos:

$ php symfony propel:build-sql

La tarea propel:build-sql genera en el directorio data/sql/ las sentencias SQL optimizadas para el sistema gestor de bases de datos que estamos utilizando:

# fragmento del archivo data/sql/lib.model.schema.sql
CREATE TABLE `jobeet_category`
(
    `id` INTEGER  NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(255)  NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `jobeet_category_U_1` (`name`)
)Type=InnoDB;

Para crear la estructura de tablas en la base de datos, ejecuta la tarea propel:insert-sql:

$ php symfony propel:insert-sql

Como la tarea anterior borra todas las tablas existentes antes de volver a crearlas, se muestra un mensaje de confirmación que debes aceptar. Si añades la opción --no-confirmation cuando ejecutas la tarea, no se muestra ningún mensaje de confirmación, lo que es útil cuando se incluye esta tarea en un script automático:

$ php symfony propel:insert-sql --no-confirmation

Nota Como sucede con cualquier otra herramienta para la línea de comandos, las tareas de Symfony admiten argumentos y opciones. Cada tarea incluye una explicación completa de su uso que se puede mostrar mediante la tarea help:

$ php symfony help propel:insert-sql

Las explicaciones muestran todos los argumentos y opciones de la tarea, los valores iniciales de cada uno de ellos y también algunos ejemplos de uso.

El ORM también se encarga de generar automáticamente las clases PHP que relacionan las tablas de la base de datos con los objetos de la aplicación:

$ php symfony propel:build-model

La tarea propel:build-model genera en el directorio lib/model/ todos los archivos PHP que se utilizan para interactuar con la base de datos. Si echas un vistazo a los archivos generados automáticamente, verás que Propel crea cuatro clases por cada tabla de la base de datos. Si por ejemplo se considera la tabla jobeet_job:

  • JobeetJob: los objetos de esta clase representan un registro de la tabla jobeet_job. Inicialmente esta clase está completamente vacía.
  • BaseJobeetJob: la clase de la que hereda JobeetJob. Al contrario que la clase anterior, cada vez que ejecutas la tarea propel:build-model, esta clase se borra y se vuelve a generar. Por tanto, si quieres personalizar las clases del modelo, lo debes hacer en la clase JobeetJob.
  • JobeetJobPeer: se trata de una clase que define los métodos estáticos utilizados para obtener colecciones de objetos de tipo JobeetJob. Inicialmente esta clase está completamente vacía.
  • BaseJobeetJobPeer: la clase de la que hereda JobeetJobPeer. Como sucede con la clase BaseJobeetJob, cada vez que ejecutas la tarea propel:build-model, esta clase se borra y se vuelve a generar. Por tanto, si quieres personalizar las clases del modelo, lo debes hacer en la clase JobeetJobPeer.

Una vez creadas las clases PHP, los valores almacenados en las columnas de un registro de la base de datos se pueden obtener y/o manipular gracias a los métodos get*() y set*() disponibles:

$job = new JobeetJob();
$job->setPosition('Web developer');
$job->save();

echo $job->getPosition();

$job->delete();

También es posible definir claves externas relacionando objetos entre sí:

$category = new JobeetCategory();
$category->setName('Programming');

$job = new JobeetJob();
$job->setCategory($category);

Por último, existe una tarea llamada propel:build-all que es un atajo de todas las tareas que hemos utilizado hasta este momento y algunas más. Así que ejecuta esta tarea para que genere de forma consecutiva las sentencias SQL, la base de datos, las clases del modelo, los formularios y los validadores:

$ php symfony propel:build-all --no-confirmation

Los validadores se muestran al final de esta lección y los formularios se explican detalladamente en la lección del día 10.

Como explicaremos más adelante, Symfony dispone de un mecanismo que carga automáticamente las clases PHP, lo que significa que nunca tendrás que utilizar una sentencia require() en tu código. La carga automática de clases es otra de las ayudas que Symfony proporciona a los programadores, aunque tiene una pega: cada vez que añades una clase nueva al proyecto es necesario borrar la cache que utiliza Symfony. Como la tarea propel:build-model acaba de crear muchas clases nuevas, no olvides borrar la cache mediante el comando:

$ php symfony cache:clear

Nota El nombre de las tareas de Symfony se compone de una primera parte llamada namespace y de una segunda parte que es el propio nombre de la tarea. Cada una de las partes se puede abreviar tanto como se quiera siempre que no se produzca una ambigüedad con el nombre del resto de tareas. Por tanto, los siguientes comandos son equivalentes a cache:clear:

$ php symfony cache:cl
$ php symfony ca:c

Además, como la tarea cache:clear es la más utilizada de Symfony con mucha diferencia, dispone de un atajo todavía más corto:

$ php symfony cc