L'écriture d'un schéma Propel est un formidable moyen de décrire une base de données. On peut déclarer la structure de base des tables avec les colonnes, les clés étrangères et même les index. Ce schéma supporte également quelques fonctionnalités plus avancées comme la déclaration onDelete :
<table name="comment"> ... <column name="article_id" type="integer" required="true" /> <foreign-key foreignTable="article" onDelete="cascade"> <reference local="article_id" foreign="id"/> </foreign-key> ... </table>
Ou en YAML:
comment:
...
article_id: { type: integer, foreignTable: article, foreignReference: id, onDelete: cascade }
...
Mais de temps en temps, vous avez besoin d'exécuter des requêtes SQL juste après que Propel ai créé les tables. Voyons comment faire cela de façon automatique à chaque appel de la tâche propel-insert-sql (ou propel:insert-sql en symfony 1.1).
La tâche propel-build-sql exécute les requêtes SQL qui vont supprimer puis re-créer les tables dans votre base de données. Ces requêtes SQL ont été générées préalablement par la tâche propel-build-sql (propel:build-sql en symfony 1.1).
Les fichiers SQL utilisés par cette tâche sont stockés dans le répertoire data/sql.
Propel crée un fichier par schéma. Si vous avez installé des plugins comme sfGuardPlugin, vous aurez plusieurs fichiers :
Si vous regardez attentivement ce répertoire, vous allez également y trouver un fichier sqldb.map:
# Sqlfile -> Database map lib.model.schema.sql=propel plugins.sfGuardPlugin.lib.model.schema.sql=propel
La tâche propel-insert-sql exécute en fait tous les fichiers contenus dans ce fichier.
Du coup, si vous souhaitez exécuter des requêtes SQL après que Propel ait créé les tables, vous avez juste à ajouter des fichiers à la fin de ce fichier :
# Sqlfile -> Database map lib.model.schema.sql=propel plugins.sfGuardPlugin.lib.model.schema.sql=propel post-table-creation.sql=propel
Dans le fichier data/sql/post-table-creation.sql, vous pouvez mettre toutes les requêtes SQL que vous souhaitez.
Le deuxième argument de chaque ligne (ici propel), est le nom de la base de données, tel que défini dans le fichier databases.yml:
all:
propel: # name of the Propel database
class: sfPropelDatabase
param:
dsn: mysql://root:@localhost/aidedecamp
Discussion