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".
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
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.
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:
php app/console redis:flushdb
)php app\console doctrine:migrations:diff
)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.
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.
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;
}
/**
* @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 !!
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? :(
Voilà comment cela a fonctionné pour moi:
src-->AppBundle-->Entity-->YourClassName.php
src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
php bin/console doctrine:schema:update --force
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