Creer la structure SQL (database + table) a partir des modeles Doctrine
Par Charles le jeudi, juillet 2 2009, 11:07 - Symfony - Lien permanent
yop yop, 1er post de ma part
je voulais simplement (re)creer la structure SQL grace aux objets Doctrines existant, le but etant de profiter de la connection a MySQL en cours (qui change selon l'environnement dev/prod) et aussi des structures des tables contenu dans les objets doctrines, la procedure se resumant a :
- recuperer la connex
- changer le nom de la base
- faire un "createDatabase"
- faire un ou plusieurs "createTable"
ayant galéré la demi journée sur ce probleme basique, je poste ici le resultat histoire d'y acceder rapidement
on recupere le singleton manager
$manager=Doctrine_Manager::getInstance();
et la connection en cours (pour ma part a ce stade, il n'y en a qu'une, celle definie dans le database.yml)
$con=$manager->getCurrentConnection();
avec cette ligne, $info est un tableau qui contient la decomposition du DSN
$info = $manager->parsePdoDsn($con->getOption('dsn'));
ce qui me permet de recomposer un nouveau DSN en changeant le nom de la database (sur ce point je n'ai pas vu de methode qui faisait l'inverse de parseDsn, a savoir de recomposer une dsn a partir du tableau $info)
$dsn=$info['scheme'].'://'.$con->getOption('username').':'.$con->getOption('password').'@'.$info['host'].'/charles_10';
//en clair ca donne mysql://user:password@localhost/charles_10
creation d'un nouvel objet connection avec ma dsn, nommé pour des raisons pratique identiquement au nom de la database
a ce moment, rien n'est fait au niveau SQL
$con_new = Doctrine_Manager::connection($dsn, 'charles_10');
ici je modifie SQL pour creer ma nouvelle database
$con_new->createDatabase();
et la, a partir de l'objet Doctrine "MonObjet" que j'ai créé precedement, je vais creer l'equivalent SQL sur ma database
$objet=new MonObjet($con_new);
try
{
$table = $objet->getTable();
$con_new->export->createTable($table->getTableName(),$table->getColumns());//y a ce "export" qui est tres obscur pour moi, pas mentionné dans l'API Doctrine
}
catch (Doctrine_Connection_Exception $e)
{
throw new Exception('echec de la creation de la table '.$table->getTableName()."\n".$e->getMessage());
}
je suis tombé sur un cas où la definition de la table a chié (avec un 'default'=>false), me petant une erreur 500 assez incomprehensible, et la trace (la pile d'appel) etait perdu dans les classes Doctrines, donc une erreur plutot dur a retrouver
je met donc un try catch en relancant une erreur un peu plus explicite, et la pile d'appel me permet de tomber directement sur la ligne du throw