Pas question de faire un "php symphony doctrine:build --db --and-load" sauvage qui va eraser toute votre Base et remettre les données initiales (fixtures), il faut faire une migration pour updater seulement ce qui a besoin de l'être !!
Voilà comment on effectue une migration côté Classes et côté Database :
1. Côté Classes (model,form,filter) :
- modifier son schema.yml : ajouter la lign de définition du nouveau champ dans la Table concernée.
- refaire ses Classes (rappel: seules les Classes de Base - de type BaseMyClass.class.php - seront régénérées, vos Classes modifiées - de type MyClass.class.php - ne seront pas touchées) :
php symfony doctrine:build --all-classes
2. Côté Database
Les Classes sont modifiées mais la Base MySQL est inchangée. Donc :
- créer une migration avec une commande de type :
php symfony doctrine:generate-migration AddMaTableMonChampColumn
où "MaTable" est le nom de la Table incriminée et "MonChamp" le champ qui est ajouté dans cette table.
- corriger cette migration générée :
On ouvre le fichier qui a été créé dans /lib/migrations/doctrine et qui est précédé d'une série de chiffres.
ex :
/lib/migrations/doctrine/123589714_addmatablemonchampcolumn.php (eh oui : tout est passé en minuscule ...)
On complète les parties de up et down (ceux qui ont tâté de Ruby on Rails reconnaissent cette construction de fichier ...).
ex :
class Addmatablemonchampcolumn extends Doctrine_Migration_Base
{
public function up()
{
$this->addColumn('ma_table', 'mon_champ', 'string', array('length' => '255'));
}
public function down()
{
$this->removeColumn('ma_table', 'mon_champ');
}
Attention aux tirets !
La migration a été générée en passant tous les caractères en minuscules. La notation CamelCase permet de définir l'emplacement des tirets : ainsi, la Classe "MaTable" fait référence à la Table "ma_table". Mais ici, dans les fonctions up() et down(), on appelle les "vrais" noms de table.
On écrira donc :
$this->addColumn('ma_table', 'mon_champ', 'string', array('length' => '255'));
et non pas :$this->addColumn('MaTable', 'mon_champ', 'string', array('length' => '255'));
qui génère une erreur (car il ne trouve pas une table du nom de "MaTable") !Rappel de convention de nommages :
pour faire fonctionner les "actAs" dans les schema.yml, les tables doivent être préfixées par le nom de la Base de Données. Donc une table que l'on voudrait appeler "supertable" dans une DB appelée "superbase" doit en fait s'appeler dans le schema.yml : SuperbaseSupertable (en CamelCase).
Lorsque Doctrine créera la DB, il créera une table du nom suivant : superbase_supertable (minuscules séparés par un tiret).
Pour revenir à notre exemple, c'est bien cette seconde notation que l'on utilise pour up() et down() dans le fichier de migration. On écrit donc :
$this->addColumn('superbase_supertable', 'mon_champ', 'string', array('length' => '255'));
php symfony doctrine:migrate
La table "superbase_supertable" (ou "ma_table" selon l'ex. précédent) a un nouveau champ/une nouvelle colonne : "mon_champ".
Merci à la documentation Symfony pour avoir pu créer ma première migration !! Et ne vous laissez pas impressionner par l'alerte en haut de page "This version of symfony is not maintained anymore", cette migration fonctionne très bien Symfony v 1.4 !
Merci à la documentation Symfony pour avoir pu créer ma première migration !! Et ne vous laissez pas impressionner par l'alerte en haut de page "This version of symfony is not maintained anymore", cette migration fonctionne très bien Symfony v 1.4 !
0 commentaires:
Enregistrer un commentaire