web-dev-qa-db-fra.com

Ajouter une colonne à une entité existante dans Symfony

J'ai joué avec Symfony sur mon serveur Web et j'ai créé une entité avec doctrine pour ma base de données. Je voulais ajouter une colonne à l'une de ces entités ... Je voulais faire quelque chose comme:

php app/console doctrine:modify:entity

Maintenant, je sais que cette commande n'existe pas, mais existe-t-il un moyen (sans faire une migration complète) d'ajouter simplement une colonne.

P.S. Je sais que je pourrais ouvrir le fichier php et y ajouter textuellement la colonne puis mettre à jour le schéma, mais je le distribue à certains clients et j'aime une approche plus "de type ligne de commande".

33
TheScripter777

En fait, utiliser Doctrine n'a aucun sens pour faire quelque chose comme vous l'avez suggéré.

Doctrine est un outil ORM (Object-Relational Mapping). Cela signifie que vous voulez faire abstraction de la base de données de votre code PHP, vous déléguez des éléments de base de données à Doctrine. Doctrine fait un excellent travail dans ce domaine.

Comme vous voulez garder vos clients/pairs à jour avec la dernière version du modèle, vous devez utiliser les migrations Doctrine ( http://symfony.com/doc/current/ bundles/DoctrineMigrationsBundle/index.html ). C'est la façon de gérer les mises à jour de la base de données. De plus, il vous donne un contrôle complet sur ce qu'il faut faire lors de la mise à niveau/rétrogradation de la base de données. Vous pouvez, par exemple, définir des valeurs par défaut avant d'ajouter le FK.

Les étapes pour ajouter une nouvelle propriété sur la classe doivent être:

Pour Symfony 2:

  • modifier la classe en:

    • Acme\MyBundle\Entity\Customer et ajoutez la propriété que vous souhaitez;

      Acme\MyBundle\Entity\Customer

    • ou modifiez le fichier doctrine:

      Acme/MyBundle/Resources/config/doctrine/customer.yml

  • exécutez la commande console (cela ajoutera le jeu/get approprié dans la classe)

    php app/console doctrine:generate:entities AcmeMyBundle:Customer

  • exécutez la commande console

    php app/console doctrine:migrations:diff

  • exécutez la commande console (elle placera un nouveau fichier sur app/DoctrineMigrations)

    php app/console doctrine:migrations:migrate

Lorsque vous déployez la nouvelle version du code, il vous suffit de mettre à jour le code source et d'exécuter la commande ci-dessus.

Pour Symfony 3:

  • modifier la classe en:

    • Acme\MyBundle\Entity\Customer et ajoutez la propriété que vous souhaitez;

      Acme\MyBundle\Entity\Customer

    • ou modifiez le fichier doctrine:

      Acme/MyBundle/Resources/config/doctrine/customer.yml

  • exécutez la commande console (cela ajoutera le jeu/get approprié dans la classe)

    php bin/console doctrine:generate:entities AcmeMyBundle:Customer

  • exécutez la commande console (mise à jour de la base de données)

    php bin/console doctrine:schema:update --force

72
P. R. Ribeiro

Vous voulez vraiment ouvrir le fichier PHP/XML/YML où votre entité est définie et y ajouter la colonne. Ensuite, vous utilisez la ligne de commande et dites

console doctrine:schema:update

De cette façon, vos définitions d'entités sont synchronisées avec la base de données et votre base de données est mise à jour.

9
Tom

Il y a un piège à l'étape php app/console doctrine:migrations:diff décrit ci-dessus lors de l'utilisation des migrations doctrine.

Vous avez apporté des modifications à l'entité, tout semble valide, mais la commande de création de migrations php app/console doctrine:migrations:diff indique "Aucune modification détectée dans vos informations de mappage."

Et vous ne pouvez pas trouver où se trouve l'ancienne structure de base de données, la recherche dans les fichiers n'a rien trouvé.

Pour moi, la clé était de vider le cache Redis.

php app/console redis:flushdb

Cela se produit à cause de config.yml

snc_redis:
    clients:
        default:
            type: predis
            alias: default
            dsn: redis://localhost
    doctrine:
        query_cache:
            client: default
            entity_manager: default
            namespace: "%kernel.root_dir%"
        metadata_cache:
            client: default
            entity_manager: default
            document_manager: default
            namespace: "%kernel.root_dir%"
        result_cache:
            client: default
            namespace: "%kernel.root_dir%"
            entity_manager: [default, read]  # you may specify multiple entity_managers

Après cela, les migrations: diff relisent toutes les entités (au lieu de prendre les métadonnées obsolètes du cache) et créent la bonne migration.


Ainsi, la chaîne complète des étapes de modification des entités est la suivante:

  1. Modifier votre classe d'entité (modifier le fichier d'entité)
  2. Vider le cache Redis des métadonnées (php app/console redis:flushdb)
  3. Créer (et modifier éventuellement) la migration (php app\console doctrine:migrations:diff)
  4. Exécutez la migration (php app\console doctrine:migrations:migrate)

Bien sûr, votre doctrine cache de métadonnées peut ne pas être Redis mais autre chose, comme des fichiers dans l'application/cache ou autre. N'oubliez pas de penser à l'effacement du cache.

Peut-être que cela aide quelqu'un.

4
FlameStorm

J'ai trouvé un moyen d'ajouter la nouvelle colonne dans YourBundle/Resources/Config/doctrine/Yourentity.orm.yml.

Ajout de méthodes getter et setter dans la classe Entity.

Puis php app/console doctrine:schema:update --force depuis la console. Ça a marché pour moi.

1
Mihir Bhende

POUR LES UTILISATEURS DE SYMFONY3 ...

ici, vous devez suivre deux étapes pour apporter des modifications à votre entité Étape 1: Ouvrez votre fichier d'entité ... Pour EX: "Acme\MyBundle\Entity\Book"

L'entité actuelle a peu de champs comme: id, nom, titre, etc. Maintenant, si vous voulez ajouter un nouveau champ "image" et faire une contrainte de changement du champ "titre" alors ajoutez un champ "image" avec getter et setter

/**
     * @var string
     *
     * @ORM\Column(name="image", type="string", length=500)
     */
    private $image;

Et ajoutez getter et setter

/**
     * Set image
     *
     * @param string $image
     *
     * @return Book
     */
    public function setImage($image)
    {
        $this->image = $image;

        return $this;
    }

    /**
     * Get image
     *
     * @return string
     */
    public function getimage()
    {
        return $this->image;
    }

Pour mettre à jour la contrainte de champ existante du titre de la longueur 255 à 500

/**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=500)
     */
    private $title;

Ok ... Vous avez fait des changements selon vos besoins, et vous êtes à un pas.

Étape 2: déclencher cette commande dans le répertoire du projet

php bin/console doctrine:schema:update --force

Maintenant, vérifiez votre table dans la base de données, c'est fait !!

1
Kunal

Je pense que vous devez mettre à jour votre table de relations manuellement pour cartographier les relations. J'ai trouvé ceci: discussion

Encore une fois, nous pouvons générer des entités à partir de la base de données existante, dans son ensemble, mais séparément? :(

0
Mayukh Roy

Voilà comment cela a fonctionné pour moi:

  • ajouter de nouveaux vars, setters et getters dans la classe existante:
    src-->AppBundle-->Entity-->YourClassName.php
  • mettre à jour le fichier ORM:
  src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
  • exécuter la commande bash:
  php bin/console doctrine:schema:update --force
0
Tech Nomad

Ajouter une nouvelle colonne dans l'entité existante sur Symfony . J'ai le même problème sont là. après de longues recherches, les meilleures solutions sont là.

travail de solution sur Symfony 4

Exemple:

Une entité de blog déjà créée dans une colonne nom est là et je veux ajouter colonne description. si simple entrez

php bin/console make:entity Blog

Après avoir exécuté cette commande, vous souhaitez ajouter une nouvelle colonne

0
Sumit patel