{"id":334,"date":"2013-04-20T22:12:14","date_gmt":"2013-04-20T20:12:14","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=334"},"modified":"2013-04-20T22:12:14","modified_gmt":"2013-04-20T20:12:14","slug":"doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/","title":{"rendered":"Doctrine : les migrations avec le bundle DoctrineMigrationsBundle (2\/3)"},"content":{"rendered":"<p>Maintenant que nous avons install\u00e9 notre <em>bundle<\/em> d\u00e9di\u00e9 aux migrations des donn\u00e9es via Doctrine, nous pouvons cr\u00e9er le bundle qui va servir de support \u00e0 notre exercice et que nous allons appeler Scolarite car il est cens\u00e9 mat\u00e9rialiser le fonctionnement de notre universit\u00e9, la fabrique de d\u00e9veloppeurs ! Voici le r\u00e9sum\u00e9 de la cr\u00e9ation de notre bundle en mode interactif :<\/p>\n<pre><strong>Symfony\/app\/console generate:bundle<\/strong>\r\nBundle namespace: FabriqueDeDevs\/ScolariteBundle\r\nBundle name [FabriqueDeDevsScolariteBundle]: \r\nTarget directory [\/home\/sebastien.ferrandez\/migrations\/Symfony\/src]: \r\nConfiguration format (yml, xml, php, or annotation): yml\r\nDo you want to generate the whole directory structure [no]? yes\r\nYou are going to generate a \"FabriqueDeDevs\\ScolariteBundle\\FabriqueDeDevsScolariteBundle\" bundle\r\nin \"\/home\/sebastien.ferrandez\/migrations\/Symfony\/src\/\" using the \"yml\" format.\r\n\r\nGenerating the bundle code: OK\r\nChecking that the bundle is autoloaded: OK\r\nConfirm automatic update of your Kernel [yes]? \r\nEnabling the bundle inside the Kernel: OK\r\nConfirm automatic update of the Routing [yes]? \r\nImporting the bundle routing resource: OK<\/pre>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/doctrine-logo.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-348\" alt=\"doctrine-logo\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/doctrine-logo.png\" width=\"215\" height=\"87\" \/><\/a><\/p>\n<h1>Les cours \u00e0 la fabrique de d\u00e9veloppeurs<\/h1>\n<p>Nous souhaitons mod\u00e9liser de mani\u00e8re tr\u00e8s simpliste la gestion des cours; des \u00e9l\u00e8ves s&rsquo;inscrivent chez nous qui choisissent des fili\u00e8res compos\u00e9es d&rsquo;un certain nombre de cours. Ces cours sont assur\u00e9s par des enseignants dans des salles. Nous \u00e9tablissons les r\u00e8gles suivantes, de mani\u00e8re tout \u00e0 fait arbitraire :<\/p>\n<ul>\n<li><span style=\"line-height: 1.714285714; font-size: 1rem;\">un <strong>\u00e9l\u00e8ve<\/strong> appartient \u00e0 une seule fili\u00e8re<\/span><\/li>\n<li><span style=\"line-height: 1.714285714; font-size: 1rem;\">une <strong>fili\u00e8re<\/strong> est compos\u00e9e d&rsquo;un ou plusieurs cours<\/span><\/li>\n<li><span style=\"line-height: 1.714285714; font-size: 1rem;\">un <strong>cours<\/strong> n&rsquo;a qu&rsquo;une seule fili\u00e8re<\/span><\/li>\n<li><span style=\"line-height: 1.714285714; font-size: 1rem;\">un <strong>enseignant<\/strong> a un ou plusieurs cours<\/span><\/li>\n<li><span style=\"line-height: 1.714285714; font-size: 1rem;\">un <strong>cours<\/strong> n&rsquo;a qu&rsquo;un seul et unique enseignant mais un enseignant a un ou plusieurs cours<\/span><\/li>\n<li><span style=\"line-height: 1.714285714; font-size: 1rem;\">un <strong>cours<\/strong> se tient dans une seule <strong>salle<\/strong> \u00e0 un moment donn\u00e9 et une salle peut abriter plusieurs cours. On peut tr\u00e8s bien cr\u00e9er un cours sans salle car il arrive qu&rsquo;on ne puisse d\u00e9cider de suite dans quelle salle il se tiendra, celle-ci sera rajout\u00e9e plus tard.<\/span><\/li>\n<\/ul>\n<p>J&rsquo;ai mis en gras les objets du domaine d&rsquo;application qui vont donc \u00eatre \u00e9ligibles au titre d&rsquo;entit\u00e9. Nous allons commencer par les plus simples et nous allons tout g\u00e9n\u00e9rer en ligne de commande sans passer par le mode interactif :<\/p>\n<pre>Symfony\/app\/console generate:doctrine:entity --no-interaction \\\r\n\r\n--entity=FabriqueDeDevsScolariteBundle:Eleve \\\r\n\r\n--fields=\"nom:string(40) prenom:string(40) age:integer\"<\/pre>\n<p>Ce que nous allons faire syst\u00e9matiquement c&rsquo;est changer l&rsquo;annotation Doctrine laiss\u00e9e vierge et qui contient le nom que la table cible va avoir.<br \/>\nRendons nous dans le fichier nouvellement g\u00e9n\u00e9r\u00e9 :<\/p>\n<pre>vi Symfony\/src\/FabriqueDeDevs\/ScolariteBundle\/Entity\/Eleve.php<\/pre>\n<p>Et rajoutons la ligne en gras dans son ent\u00eate:<\/p>\n<pre>\/**\r\n * Eleve\r\n *\r\n * @ORM\\Table(<strong>name=\"eleve\"<\/strong>)\r\n * @ORM\\Entity\r\n *\/<\/pre>\n<p>Maintenant que nous avons g\u00e9n\u00e9r\u00e9 une premi\u00e8re entit\u00e9, notre sch\u00e9ma de bases de donn\u00e9es va devoir refl\u00e9ter ce changement, c&rsquo;est \u00e0 dire passer de l&rsquo;\u00e9tat initial 0 \u00e0 l&rsquo;\u00e9tat 1 \u00ab\u00a0une table \u00e9l\u00e8ve est \u00e0 cr\u00e9er\u00a0\u00bb.<br \/>\nNous faisons usage de l&rsquo;argument diff :<\/p>\n<pre>Symfony\/app\/console doctrine:migrations:diff<\/pre>\n<p>Un fichier est g\u00e9n\u00e9r\u00e9 :<\/p>\n<pre>Generated new migration class to \"\/home\/sebastien.ferrandez\/migrations\/Symfony\/app\/DoctrineMigrations\/Version20130420192803.php\" from schema differences.<\/pre>\n<p>Vous devinez ais\u00e9ment le format de ces fichiers : VersionYYYYMMDDHHMMSS. Voyons ce que celui-ci contient :<\/p>\n<pre>class Version20130420192803 extends AbstractMigration\r\n{\r\n    public function up(Schema $schema)\r\n    {\r\n        \/\/ this up() migration is autogenerated, please modify it to your needs\r\n        $this-&gt;abortIf($this-&gt;connection-&gt;getDatabasePlatform()-&gt;getName() != \"mysql\");\r\n\r\n        $this-&gt;addSql(\"<strong>CREATE TABLE eleve (id INT AUTO_INCREMENT NOT NULL, nom VARCHAR(40) NOT NULL, prenom VARCHAR(40) NOT NULL, age INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB<\/strong>\");\r\n    }\r\n\r\n    public function down(Schema $schema)\r\n    {\r\n        \/\/ this down() migration is autogenerated, please modify it to your needs\r\n        $this-&gt;abortIf($this-&gt;connection-&gt;getDatabasePlatform()-&gt;getName() != \"mysql\");\r\n\r\n        $this-&gt;addSql(\"DROP TABLE eleve\");\r\n    }\r\n}<\/pre>\n<p>Vous voyez d&#8217;embl\u00e9e deux m\u00e9thodes, up et down; la premi\u00e8re est ex\u00e9cut\u00e9e dans le sens ascendant, c&rsquo;est \u00e0 dire en cas de migration et l&rsquo;autre dans le sens descendant, dans le cas d&rsquo;une r\u00e9tro-migration (d&rsquo;un <em>rollback<\/em>). On retrouve dans l&rsquo;un les actions antagonistes de l&rsquo;autre, si dans up vous avez un create table, vous aurez un drop table dans le down.<br \/>\nC&rsquo;est dans ce fichier que vous pouvez changer les types de donn\u00e9es dans vos requ\u00eates SQL avant g\u00e9n\u00e9ration des \u00e9l\u00e9ments de la base de donn\u00e9es ! Quoiqu&rsquo;il en soit, les changements du diff ne sont pas appliqu\u00e9s \u00e0 la base de donn\u00e9es tant que vous n&rsquo;avez pas utilis\u00e9 la commande migrate :<\/p>\n<pre>Symfony\/app\/console doctrine:migrations:migrate<\/pre>\n<p>Voici ce que me donne \u00e0 l&rsquo;\u00e9cran l&rsquo;ex\u00e9cution de cette commande :<\/p>\n<pre>Migrating up to 20130420192803 from 0\r\n\r\n  ++ migrating 20130420192803\r\n\r\n     -&gt; CREATE TABLE eleve (id INT AUTO_INCREMENT NOT NULL, nom VARCHAR(40) NOT NULL, prenom VARCHAR(40) NOT NULL, age INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB\r\n\r\n  ++ migrated (0.08s)\r\n\r\n  ------------------------\r\n\r\n  ++ finished in 0.08\r\n  ++ 1 migrations executed\r\n  ++ 1 sql queries<\/pre>\n<p>Je migre bien de l&rsquo;\u00e9tat 0 vers l&rsquo;\u00e9tat 20130420192803 en faisant un <em>CREATE TABLE eleve<\/em>. Tout se passe conform\u00e9ment \u00e0 ce que nous imaginions&#8230;Continuons avec notre deuxi\u00e8me entit\u00e9, celle qui concerne nos enseignants :<\/p>\n<pre>Symfony\/app\/console generate:doctrine:entity --no-interaction \\\r\n\r\n--entity=FabriqueDeDevsScolariteBundle:Enseignant \\\r\n\r\n--fields=\"nom:string(40) prenom:string(40) age:integer\"<\/pre>\n<p>Nous allons faire la m\u00eame chose que pr\u00e9c\u00e9demment :<\/p>\n<ul>\n<li><span style=\"line-height: 1.714285714; font-size: 1rem;\">donner, dans notre entit\u00e9, un nom \u00e0 la table qui va \u00eatre cr\u00e9\u00e9e<\/span><\/li>\n<li>faire un diff<\/li>\n<li><span style=\"line-height: 1.714285714; font-size: 1rem;\">faire un migrate<\/span><\/li>\n<\/ul>\n<p>Le diff produit un fichier de migration qui va cette fois concerner la table enseignant, dont nous venons de mettre le nom dans l&rsquo;entit\u00e9 qui va la g\u00e9rer. Le migrate, lui, va donner :<\/p>\n<pre>WARNING! You are about to execute a database migration that could result in schema changes and data lost. Are you sure you wish to continue? (y\/n)y\r\nMigrating up to 20130420214445 from 20130420192803\r\n\r\n  ++ migrating 20130420214445\r\n\r\n     -&gt; C<strong>REATE TABLE enseignant (id INT AUTO_INCREMENT NOT NULL, nom VARCHAR(40) NOT NULL, prenom VARCHAR(40) NOT NULL, age INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB<\/strong>\r\n\r\n  ++ migrated (0.05s)\r\n\r\n  ------------------------\r\n\r\n  ++ finished in 0.05\r\n  ++ 1 migrations executed\r\n  ++ 1 sql queries<\/pre>\n<p>Nous en profitons pour voir comment \u00e9volue les tuples de table migration_versions, g\u00e9r\u00e9e par Doctrine :<\/p>\n<pre>sebastien.ferrandez@sebastien:~\/migrations$ mysql -u root -p -e 'use exercice; select * from migration_versions'\r\nEnter password: \r\n+----------------+\r\n| version        |\r\n+----------------+\r\n| 20130420192803 |\r\n| 20130420214445 |\r\n+----------------+<\/pre>\n<p>Vous voyez que toute commande <em>migrate<\/em> entra\u00eene la cr\u00e9ation d&rsquo;une ligne dans cette table ! Nous continuons avec la cr\u00e9ation des autres entit\u00e9s :<\/p>\n<pre>Symfony\/app\/console generate:doctrine:entity --no-interaction \\\r\n--entity=FabriqueDeDevsScolariteBundle:<strong>Salle<\/strong> \\\r\n--fields=\"nom:string(40)\"\r\n\r\nSymfony\/app\/console generate:doctrine:entity --no-interaction \\\r\n--entity=FabriqueDeDevsScolariteBundle:<strong>Cours<\/strong> \\\r\n--fields=\"nom:string(40) date:datetime duree:integer\"\r\n\r\nSymfony\/app\/console generate:doctrine:entity --no-interaction \\\r\n--entity=FabriqueDeDevsScolariteBundle:<strong>Filiere<\/strong>\\\r\n--fields=\"nom:string(40)\"<\/pre>\n<p>L&rsquo;id\u00e9e est d&rsquo;isoler chaque changement du sch\u00e9ma de base de donn\u00e9es (pour faire plus simple, chaque cr\u00e9ation de table) dans une migration. Si nous passons une gigantesque migration qui contient TOUT, en cas de n\u00e9cessit\u00e9 de r\u00e9tro-migrer, nous nous retrouverions \u00e0 faire un grand pas en arri\u00e8re au lieu de reculer \u00e0 petits pas.<br \/>\nNous avons fini avec les entit\u00e9s, nous allons \u00e0 pr\u00e9sent dans la derni\u00e8re partie, \u00ab\u00a0raccorder\u00a0\u00bb celles qui doivent l&rsquo;\u00eatre ! A suivre&#8230;<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/symfony_black_03.png\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-349\" alt=\"symfony_black_03\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/symfony_black_03.png\" width=\"172\" height=\"172\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/symfony_black_03.png 172w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/symfony_black_03-150x150.png 150w\" sizes=\"(max-width: 172px) 100vw, 172px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Maintenant que nous avons install\u00e9 notre bundle d\u00e9di\u00e9 aux migrations des donn\u00e9es via Doctrine, nous pouvons cr\u00e9er le bundle qui va servir de support \u00e0 notre exercice et que nous allons appeler Scolarite car il est cens\u00e9 mat\u00e9rialiser le fonctionnement de notre universit\u00e9, la fabrique de d\u00e9veloppeurs ! Voici le r\u00e9sum\u00e9 de la cr\u00e9ation de [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[38,33],"tags":[34,39,36],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Doctrine : les migrations avec le bundle DoctrineMigrationsBundle (2\/3) - La Fabrique de code - Tech blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Doctrine : les migrations avec le bundle DoctrineMigrationsBundle (2\/3) - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Maintenant que nous avons install\u00e9 notre bundle d\u00e9di\u00e9 aux migrations des donn\u00e9es via Doctrine, nous pouvons cr\u00e9er le bundle qui va servir de support \u00e0 notre exercice et que nous allons appeler Scolarite car il est cens\u00e9 mat\u00e9rialiser le fonctionnement de notre universit\u00e9, la fabrique de d\u00e9veloppeurs ! Voici le r\u00e9sum\u00e9 de la cr\u00e9ation de [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-04-20T20:12:14+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/doctrine-logo.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:site\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/\",\"name\":\"Doctrine : les migrations avec le bundle DoctrineMigrationsBundle (2\/3) - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2013-04-20T20:12:14+00:00\",\"dateModified\":\"2013-04-20T20:12:14+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Doctrine : les migrations avec le bundle DoctrineMigrationsBundle (2\/3)\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/\",\"name\":\"La Fabrique de code - Tech blog\",\"description\":\"PHP objet, MySQL, Design Patterns, OOP...et plus !\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"caption\":\"admin\"},\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Doctrine : les migrations avec le bundle DoctrineMigrationsBundle (2\/3) - La Fabrique de code - Tech blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/","og_locale":"fr_FR","og_type":"article","og_title":"Doctrine : les migrations avec le bundle DoctrineMigrationsBundle (2\/3) - La Fabrique de code - Tech blog","og_description":"Maintenant que nous avons install\u00e9 notre bundle d\u00e9di\u00e9 aux migrations des donn\u00e9es via Doctrine, nous pouvons cr\u00e9er le bundle qui va servir de support \u00e0 notre exercice et que nous allons appeler Scolarite car il est cens\u00e9 mat\u00e9rialiser le fonctionnement de notre universit\u00e9, la fabrique de d\u00e9veloppeurs ! Voici le r\u00e9sum\u00e9 de la cr\u00e9ation de [&hellip;]","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2013-04-20T20:12:14+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/doctrine-logo.png"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/","name":"Doctrine : les migrations avec le bundle DoctrineMigrationsBundle (2\/3) - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2013-04-20T20:12:14+00:00","dateModified":"2013-04-20T20:12:14+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/doctrine-les-migrations-avec-le-bundle-doctrinemigrationsbundle-suite\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Doctrine : les migrations avec le bundle DoctrineMigrationsBundle (2\/3)"}]},{"@type":"WebSite","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website","url":"http:\/\/www.lafabriquedecode.com\/blog\/","name":"La Fabrique de code - Tech blog","description":"PHP objet, MySQL, Design Patterns, OOP...et plus !","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","contentUrl":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","caption":"admin"},"url":"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/334"}],"collection":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/comments?post=334"}],"version-history":[{"count":14,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/334\/revisions"}],"predecessor-version":[{"id":351,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/334\/revisions\/351"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=334"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=334"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=334"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}