66 votes

Générer une seule Entité à partir d'une base de données existante en utilisant symfony2 et doctrine

Est-il possible de générer une seule entité à partir de la base de données en utilisant l'outil console Symfony2?

En plein codage, j'ai dû ajouter une table et des modifications ont été apportées aux classes d'entité existantes. Je ne veux donc pas que toutes mes entités soient régénérées.

Toute suggestion sera appréciée!

1 votes

De nombreuses personnes semblent encore avoir des problèmes avec une base de données qui a des tables sans clés primaires - '--filter' lit toujours ces tables, et échoue. Utilisez la configuration doctrine.yaml : doctrine.dbal.connections.CONNECTION_NAME.schema_filter: ~^(table_prefix_name_).*~ ou utilisez l'expression régulière pour sauter des tables spécifiques

111voto

Coussinsky Points 1102

J'ai eu le même problème, vous devez le faire de cette manière:

php app/console doctrine:mapping:convert metadata_format \
    ./src/App/MyBundle/Resources/config/doctrine \
    --from-database \
    --filter="VotreTable"

Ensuite

php app/console doctrine:mapping:import AppMyBundle \
    metadata_format --filter="VotreTable"

metadata_format est le format de fichier que vous voulez générer (par exemple, xml, yml, annotation)

Et enfin

php app/console doctrine:generate:entities AppMyBundle --no-backup

Ainsi, Doctrine ne chargera que l'entité dont vous avez besoin. Faites juste attention au filtre, vous devez utiliser le CamelCase!

J'espère que cela vous aidera

0 votes

Formidable ! Cela a été utile. Heureux de vous accorder la prime bien méritée mon ami. Merci!

14 votes

Mon plaisir, j'ai eu des moments difficiles sur cette question. Fais juste attention au filtre, il est assez "sensible" comme si vous définissez --filter="mytable" Doctrine prendra toutes les tables commençant par "mytable" et pas seulement la table nommée "mytable" (j'ai aussi eu ce problème).

2 votes

@Coussinsky Cela fonctionne sauf que j'ai un petit souci : --filter=MyTable ne fonctionne pas. Si je supprime l'option, je reçois toutes les tables de la base de données, si j'ajoute l'option, je reçois : "Aucune classe de métadonnées à traiter.". Des idées ? stackoverflow.com/questions/13629959/…

30voto

John Baldwin Points 131

Pour la troisième commande, doctrine continuait de régénérer tous les fichiers Entity. En ajoutant le nom de l'entité après le bundle, il a généré uniquement l'entité qui m'intéressait.

php app/console doctrine:generate:entities AppMyBundle:VotreNomDeTable --no-backup

2 votes

Il doit être inclus dans la réponse principale, c'est pourquoi Doctrine a régénéré toutes mes ~300 entités.

3 votes

En réalité, si j'utilise cette commande, j'ai L'espace de noms "VENDOR\MyBundle\Entity\TableName" ne contient aucune entité mappée., et si j'utilise doctrine:generate:entities complet, il régénère toutes mes entités sauf la nouvelle... Qu'est-ce que je fais de mal ?!

2 votes

Cela ne fonctionne pas pour moi non plus. Cela génère des entités à partir de tous mes bundles.

14voto

user1704745 Points 1

Solution de travail simple pour l'annotation d'option Symfony 2.7 et pour [/xml/yml] voir http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

effectuez 3 commandes en 3 étapes :

$ php app/console doctrine:mapping:import --force AppBundle xml --filter="Meeting"

(REMARQUE : si le nom de votre base de données est my_meeting vous devrez le changer en MyMeeting dans filter="MyMeeting" pour que Doctrine trouve le nom de votre table. Cela est dû au fait que Doctrine supprime toujours les underscores et ajoute Camel-case à votre nom de table. Sinon, vous obtiendrez cette erreur : "Database does not have any mapping information".)

$ php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity --from-database --filter="Meeting"

(REMARQUE : assurez-vous d'avoir namespace AppBundle\Entity; comme ci-dessous dans votre fichier de classe Meeting.php comme ceci :

``

Si ce n'est pas le cas, ajoutez-le.)

où :

  • AppBundle est exactement votre "AppBundle" dans Symfony 2.7
  • Meeting est la table cible (sensible à la casse Camel-Case)

Pour VÉRIFIER, consultez ce répertoire :

src\AppBundle\Resources\config\doctrine\Meeting.orm.xml

ET ASSUREZ-VOUS de n'avoir que des fichiers .xml pour la table que vous voulez créer des fichiers de classe d'entité et aucun autre. Ensuite, exécutez la commande ci-dessous pour générer les méthodes get et set pour la classe d'entité que vous avez créée précédemment.

$ php app/console doctrine:generate:entities AppBundle:Meeting --no-backup

REMARQUE2 : Comme dernière étape, vous devez supprimer le fichier de base de données orm xml dans par exemple src\AppBundle\Resources\config\doctrine\VisitorData.orm.xml

Cela fonctionne très bien pour moi.

Pour plus d'explications, veuillez lire: http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

``

9voto

Carlton Points 428

Le commentaire de @fyrye qui est actuellement masqué mérite d'être crédité, je voulais ajouter cela pour que d'autres ne le manquent pas. Voici l'approche :

/** @var \Doctrine\DBAL\Connection $connection */
$config = $connection->getConfiguration();

// pour exclure une table spécifique
$config->setFilterSchemaAssetsExpression('/^(table_to_reverse_engineer_1|table_to_reverse_engineer_2).*$/');

source: https://coderwall.com/p/jofhdw/doctrine-tell-which-tables-to-work-with

J'avais des problèmes lors de l'exécution de la commande suivante en raison du grand nombre de tables héritées mal définies

php ./vendor/bin/doctrine orm:convert-mapping --force --from-database annotation ./src/UI/Entity/

Il s'avère que le drapeau --filter ne filtre qu'APRÈS avoir lu les métadonnées de toutes vos tables, ce qui, s'ils n'ont pas de clés primaires ou ont un autre problème, provoquera l'échec de la commande

6voto

Brett Thomas Points 103

Aucune des réponses n'étaient tout à fait adaptées pour moi en utilisant Symfony 3. J'ai fini par faire :

php bin/console doctrine:mapping:import --force MyBundle xml --filter="MyTable"

php bin/console doctrine:mapping:convert annotation ./src --filter="MyTable"

php bin/console doctrine:generate:entities MyBundle:MyTable --path ./src

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X