Hello hello !
j'ai cree dans un 1er temps une table ( une entité) symfony console make:entity puis mes 2 messages de migrations : php bin/console make:migration et php bin/console doctrine:migrations:migrate Là Tout OK puis j'ai cree 2 autres entités mais cette fois je n'ai pas fait correctement , j'ai du me tromper et j'ai refait avant la migration le make symfony make:entity (je crois) d'ou le fait que : mes 2 fichiers de chaque table sont bien crees : dans entity et dans repositories mais
du coup meme si je refais php bin/console make:migration et php bin/console doctrine:migrations:migrate elles ne vont pas dans ma DB ca ne me genere que malheureusement un fichier dans migration version....
d'ou mes questions apres ces explications :
-faut il creer une à une les entités obligatoirement? et faire les 2 migrations?

  • ai je donc bien fait de supprimer mon fichier dans migration version... muisque il en a genere un autre idem?
  • comment je resoud mon proble pour avoir mes tables dans ma DB? je suprime mes entites et je recommence?

pourquoi je ne pourrai pas finalement avoir une seul fichier dans migrations: version.... qui aurait toutes mes requetes?

merci bien

13 réponses


Bonjour,

Doctrine crée des fichier de migration qui permettent de 'versionner' les différents état de ta base de données.

Exemple : Si tu crée une entité Person puis, que tu lances la commande make:migration, Doctrine va créer un nouveau fichier dans ton dossier migrations qui listera les requetes à éxécuter pour mettre à jour ta db mais aussi de revenir en arrière (cf. méthode down). Ici, l'ajout de la table Person. Admettons que tu veuilles faire une évo en ajoutant les champs lastname & firstname dans Person (Sois avec la commande make:entity ou directement dans l'entité Person), make:migration va maintenant regarder les anciennes migrations pour ne créer que les requêtes nécessaires pour que ton mapping entre ton code et la base de données match. Ici, l'ajout du la colonne firstname et lastname dans la table Person. Automatiquement, un fichier de migration sera crée dans ton dossier migrations.

Note: Ta base de données devrait avoir une table qui stocke les migrations éxécutées, ce qui te permet de savoir si ta base données est à jour avec tes migrations.

  1. Supprimer les migrations est un peu overkill. Tu peux utiliser Merging Historical Migrations, pour fusionner tes migrations.

  2. Normalement, tu n'as pas besoin de supprimer tes entités. Pour recommencer tu peux faire le process suivant :

    • Supprimer toute les tables de ta base données,
    • Supprimer tes migrations,
    • Lancer la commande php bin/console m:migration (make:migration),
    • Enfin, php bin/console d:m:mi (doctrine:migration:migrate).

Remarque : Tu peux lancer les commandes en utilant des alias pour aller plus vite (ex. php bin/console m:entity).

Si tes entités sont correctements créées, ta base de données devrait maintenant contenir des tables représentant tes entités avec dans le dossier migrations un fichier VersionXXXX.php (préférer faire Merging Historical Migrations plutôt que la suppression direct).

Malaury
Auteur

hello htachoires ! woaho ca c'est de l'explication !! merci ok j'ainoté tout ca ! super quand meme symfony ! j'ai commencé avnt hier et franchement c'est bleufant!
d'ailleurs je viens de voir que l'on devait mettre les relations lors de la creation des tables et champs ,ce que je n'ai pas fait non plus ! merci pour toutes ces indications precieuses

Je viens de faire ce que tu m'as dit ! tout s'est bien passé sauf que je reviens au point de depart j'ai toujours pas les 2 entites manquantes dans phpmyadmin !
bizarre quand meme !
nb: quand tu ecris"supprime tes migrations-->tu voulais dire de supprimer les fichiers dans mon ide ou supprimerle fichier doctrine de ma bdd?
pour le coup je reviens au point de depart soit :

  • mes fichiers migrations
    -mes entitys 4 dans VSC
  • 2 dansphpMyadmin avec la doctrine migration versions

Pour la partie suppression des migrations, c'est les fichiers dans le dossier migrations et de toutes tes tables (dont doctrine_migration_versions) à supprimer. Pour faire claire, quand tu as des problèmes avec la db (database) et que tu travailles tout(e) seul(e) tu peux te permettre de vider ta db et tes migrations, mais c'est vraiment pas une bonne pratique.

  • Tu peux me montrer le contenu de la classe VersionXXX.php généré par la commande make:migration (normalement la seule) ?
  • Une entité non importée lors de la migration vers la base de donnée (Pour vérifier si ton entité a bien été générée) ?
  • As-tu bien une table nommée doctrine_migration_versions avec le(s) nom(s) de(s) la migration(s) ?
Malaury
Auteur

Le dernier fichier version qui a ete generé par ce que j'ai fait comme tu m'as dit :


final class Version20210407100356 extends AbstractMigration
{
    public function getDescription() : string
    {
        return '';
    }

    public function up(Schema $schema) : void
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->addSql('CREATE TABLE stance (id INT AUTO_INCREMENT NOT NULL, frontside_and_backside VARCHAR(155) NOT NULL, switch_stance VARCHAR(155) NOT NULL, regular TINYINT(1) NOT NULL, goofy TINYINT(1) NOT NULL, id_stance INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
        $this->addSql('CREATE TABLE tchat (id INT AUTO_INCREMENT NOT NULL, user_id INT NOT NULL, avatar_name VARCHAR(200) NOT NULL, trick_id INT NOT NULL, stance_id INT DEFAULT NULL, content VARCHAR(355) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
        $this->addSql('CREATE TABLE trick (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, id_stance INT NOT NULL, description VARCHAR(355) NOT NULL, id_user INT NOT NULL, created_at DATETIME NOT NULL, edit_at DATETIME NOT NULL, delete_at DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
        $this->addSql('CREATE TABLE user (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255) NOT NULL, email VARCHAR(200) NOT NULL, password VARCHAR(200) NOT NULL, created_at DATETIME NOT NULL, destroy_at DATETIME NOT NULL, token VARCHAR(255) NOT NULL, avatar_name VARCHAR(255) NOT NULL, is_valid TINYINT(1) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
    }

    public function down(Schema $schema) : void
    {
        // this down() migration is auto-generated, please modify it to your needs
        $this->addSql('DROP TABLE stance');
        $this->addSql('DROP TABLE tchat');
        $this->addSql('DROP TABLE trick');
        $this->addSql('DROP TABLE user');
    }
donc  là  j'ai bien mes 4 classes

mais le souci  c'est que cette classe trick  je l'ai deja dans le 1er fichier version
```

final class Version20210406143602 extends AbstractMigration

{
public function getDescription() : string
{
return '';
}

public function up(Schema $schema) : void
{
    // this up() migration is auto-generated, please modify it to your needs
    $this->addSql('CREATE TABLE trick (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
}

et OUI   j'ai bien une classe
doctrine_migration_version

je crois que ca serait plus simple que je m'entraine et que je refasse une creation de projet !
sachant que je viens de voir une video  qui precise qu'il faut faire les relations des tables lors de la creation !
ce que je n'ai pas fait !!  il faut que je note etape par etape  du point de depart! comme ca j'eviterai les erreurs!

Bonjour Malaury,

htachoires a super bien expliqué.
Le mieux c'est de nous retourner les erreurs que tu as.

  • N'oublie pas de vérifier que ton projet est bien connecté à la base de donné, dans ton fichier ".env" à la raicine du projet. ".env.local" si tu l'as crée.
  • Que ta base de donné existe avec un "symfony console doctrine:database:create"
  • Supprime toutes tes migrations directement dans le fichier "migrations" ( pas conseillé en général comme dit par htachoires)

puis tu recommences
Ton entités est ok ?

  • symfony console make:migration
  • symfony console doctrine:migration:migrate

à ce niveau là tu devrais avoir ta base de donné crée avec tes tables vides.

Pour compléter tes tables avec des donnés. Il faut crée des fixutres
et la commande suivant "symfony console doctrine:fixtures:load"

Voilà, tu as toutes les explications, amuses toi bien ;)

Lorsque tu lances php bin/console d:m:mi, la classe Version20210406143602 existe toujours ?

Pour le process, tu dois avant de relancer la comande make:migration supprimer ta base de données et TOUS tes fichiers VersionXXX.php, enfin php bin/console d:m:mi.

Tu peux recréer un projet mais je ne pense pas que ce soit necéssaire, ton projet est correcte. Il faut que tu arrives à comprendre ce qu'a besoin Doctrine pour générer ta base de données.

Note : Pour ne plus reproduire ton problème, il est important de garder les fichiers VersionXXX.php générés par Doctrine.

Malaury
Auteur

Lorsque tu lancesphp bin/console d:m:mi○6, la classe Version20210406143602 existe toujours ? OUI OUI c'est ca qui est etrange ! non!

J'ai bien fait ce qu'il fallait dans le fichier .env !! tout est bien ok et ma DB est bien cree ! de ce coté l à pas de souci ! juste que c'est en faisant qu'on apprend et bon ! ca fait que à peine 2 jours que je suis là dessus meme moins !

oui c'est vrai tu as raison le projet est correct ! mais etrange tout de meme que le 1er version soit tjs là !
je voulais refaire un new projet car il faut que je mette mes relations !! elles ne sont pas faite et du coup dans mon phpmyadmin j'ai un mpd ou les tables ne sont pas liees ! quoi qu'il en soit : je n'ai pas mes 4 tables dans ma DB ! :)

Il faut que tu supprimes tous tes fichiers VersionXXX.php. Sinon Doctrine va se baser sur les anciennes migrations (cf. le principe de fonction des migrations dans le premier message que je t'ai envoyé. Tu peux aussi (et je te le conseille) visiter la doc de Doctrine pour avoir une explication beaucoup plus succinte) qui actuellement, font foirer tes migrations. En supprimant les fichiers de migration et vider toute ta base de données, c'est comme recommencer un projet from scratch mais seulement pour pour ta base de données .

Malaury
Auteur

Oui je viens de supprimer comme tu m'as dit !! merci pour ces supers explications !
j'ai compris le principe ! apres je vais peut être encore me planter mais c'est le jeu au debut :) merci
je refais mes classes et je garde cette db !
je retourne visiter la doc de Doctrine :)

J'ai refait ! ca m'apprend !
symfony new --full nom_de_mon_projet
j'ai cree mon new project OK , j'ai ouvert mon dossier dans monIDE Visual St Code
mais pourquoi bon sang! je lis qu'il faut pour ouvrir mon serveur local faire dans mon invit cde
avec symfony serve -d et je dois tomber sur mon lien et bien ca fonctionne pas ! pour arriver à ouvrir le serveur dans invit cde VSC:
je dois faire : php -S localhost:8000 -t public franchement j'aime bien comprendre !!

ensuite je vais faire la creation de mes entities

Malaury
Auteur

Hello en fait , ou j'ai pas compris vos explications bien que très claires mais : j'ai supprimé dans l'entité des champs directement ( meme si c'est pas top)
ensuite j'ai fait les 2 migrations

  • ca a ajouté ce que j'ai ajouté
    -ca n'a abolument pas supprimé ce que j'ai supprimé?

alors je repose cette question? comment fait on pour supprimer un field cree par erreur dans une entité?
j'ai fait et ca n'a rien fait : php bin/console doctrine:schema:update --force
merci bien

ah oui et surtout j'ai une question primordiale :
peux t'on creer toutes les entites les une apres les autres et ensuite faire les 2 codes de migrations?

Bonjour Malaury,
https://www.youtube.com/watch?v=e5udJTjbYzw

Voici une vidéo qui va tout t'expliquer simplement. Tu vas te régaler !! ;)
Tu pourrais même commencer par la première. Il y en a 4 en tout. Une super bonne base pour commencer symfony.
Et surtout, n'hésite pas à prendre l'habitude d'utiliser la documentation symfony de temps en temps.

https://symfony.com/doc/current/index.html

Malaury
Auteur

slt oui tes liens sont parfaits ,, la video aussi j'avais commencé par cela d'ailleurs !

Je viens de refaire pour m'entrainer !! j'ai donc testé mes relations mais mais..... et bien la debutant de 4 jours continue à faire des betises !
je trouve rien de concrèt lorsque l'on veut supprimer une entity?
comme je me suis plantée dansma relation, comme je ne sais pas comment supprimer la relation mauvaise, et bien je voudrais bien supprimer l'entite etant donné que je n'aurai que celle là à supprimer puisque mon erreur de relation : A vers A donc j'ai fichu ma relation de la table sur la meme table ! lol

J'ai tenté!! allez soyons fou ! c'est en forgeant que l'on devient forgeron ! :) bon ok j'ai supprimé mon entity ainsi que le fichier repository, puis j'ai fait mes migrates
En revanche : je n'ai pas compris malgré que htachoires m'ait envoyé vers un lien sur ce sujet ! desolee !
mais questions : est il possible de tout regrouper dans un seul fichier version ( exemple: toutes les creations des entites? )

Salut,
Pour regrouper les entités, non pas du tout ! Il faut garder le principe une class pour un objet en gros.

Quand tu utilises la commande "symfony console make:entity"

Imaginons tu crée une propriété "name"
symfony va te crée dans ta classe entité.

la propriété :

/**
     * @ORM\Column(type="string")
     */
    private $name;

les méthodes :

public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

Tu peux les supprimer directement depuis l'entité
refaire le commande symfony console make:entity User
et recrée ton champs "name"

Sachant que pour les entités relation One to Many etcc
il n'y aura pas de méthode setName mais addEtcc

Là c'est le début, donc ne t'inquiète pas si tu es bloqués, c'est normal ^^
Et une fois que tu as un peux compris tu modifiera toi même t'es entités à la main ^^.