Ver índice de contenidos del libro

8.8. No crees el modelo dos veces

La desventaja de utilizar un ORM es que se debe definir la estructura de datos 2 veces: una para la base de datos y otra para el modelo de objetos. Por suerte, Symfony dispone de utilidades de línea de comandos para generar uno en función del otro, de modo que se evita duplicar el trabajo.

8.8.1. Construir la estructura SQL de la base de datos en función de un esquema existente

Si se crea la aplicación escribiendo el archivo schema.yml, Symfony puede generar las instrucciones SQL que crean las tablas directamente a partir del modelo de datos en YAML. Para generarlas, se ejecuta el siguiente comando desde el directorio raíz del proyecto:

> php symfony propel:build-sql

El anterior comando crea un archivo lib.model.schema.sql en el directorio miproyecto/data/sql/. El código SQL generado se optimiza para el sistema gestor de bases de datos definido en el parámetro phptype del archivo propel.ini.

Se puede utilizar directamente el archivo schema.sql para construir la base de datos. Por ejemplo, en MySQL se puede ejecutar lo siguiente:

> mysqladmin -u root -p create blog
> mysql -u root -p blog < data/sql/lib.model.schema.sql

El código SQL generado también es útil para reconstruir la base de datos en otro entorno o para cambiar de sistema gestor de bases de datos. Si el archivo propel.ini define las opciones de conexión correctas con la base de datos, el comando php symfony propel:insert-sql se encarga de crear automáticamente las tablas.

Truco La línea de comandos también incluye una tarea para volcar los contenidos de un archivo de texto a la base de datos. El Capítulo 16 incluye más información sobre la tarea propel:data-load y sobre los archivos en formato YAML llamados "fixtures".

8.8.2. Construir un modelo de datos en formato YAML a partir de una base de datos existente

Symfony puede utilizar la capa de acceso a bases de datos proporcionada por Creole para generar un archivo schema.yml a partir de una base de datos existente, gracias a la introspección (que es la capacidad de las bases de datos para determinar la estructura de las tablas que la forman). Se trata de una opción muy útil cuando se hace ingeniería inversa o si se prefiere trabajar primero en la base de datos antes de trabajar con el modelo de objetos.

Para construir el modelo, el archivo propel.ini del proyecto debe apuntar a la base de datos correcta y debe tener todas las opciones de conexión. Después, se ejecuta el comando propel:build-schema:

> php symfony propel:build-schema

Se genera un nuevo archivo schema.yml a partir de la estructura de la base de datos y se almacena en el directorio config/. Ahora se puede construir el modelo a partir de este esquema.

El comando para generar el esquema es bastante potente y es capaz de añadir diversa información relativa a la base de datos en el esquema. Como el formato YAML no soporta este tipo de información sobre la base de datos, se debe generar un esquema en formato XML para poder incluirla. Para ello, solo es necesario añadir el argumento xml a la tarea build-schema:

> php symfony propel:build-schema --xml

En vez de generar un archivo schema.yml, se crea un archivo schema.xml que es totalmente compatible con Propel y que contiene toda la información adicional. No obstante, los esquemas XML generados suelen ser bastante profusos y difíciles de leer.