web-dev-qa-db-fra.com

Générer une seule entité à partir d'une base de données existante à l'aide de symfony2 et doctrine

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

Au milieu du codage, j'ai dû ajouter un tableau et des modifications ont été apportées aux classes d'entités existantes. Donc, je ne veux pas que toutes mes entités soient régénérées.

Toute suggestion sera appréciée!

57
Sethunath

J'ai eu le même problème, vous avez à faire de cette façon:

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

Ensuite

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

metadata_format est le fichier se terminant que vous souhaitez générer (par exemple, xml, yml, annotation)

Et enfin

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

Comme ceci doctrine ne chargera que l'entité dont vous avez besoin. Faites attention au filtre, vous devez utiliser CamelCase!

J'espère que ceci vous aidera

101
Snroki

Pour la troisième commande, doctrine conservait la régénération de tous les fichiers d'entité. En ajoutant le nom de l'entité après l'ensemble, elle ne générait que l'entité qui m'intéressait.

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

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

faire 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" for doctrine pour trouver votre nom de table. Ceci est dû au fait que doctrine supprimera toujours les caractères de soulignement et ajoutera Camel-case à votre nom de table. Sinon, vous obtiendra cette erreur: "La base de données ne contient aucune information de mappage".)

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

( NOTE: en vous assurant que vous avez namespace AppBundle\Entity; comme ci-dessous dans votre fichier de classe Meeting.php comme ceci:

<?php
/**
* Created by PhpStorm.
* User:
* Date: 03-Sep-2015
* Time: 3:23 PM
*/
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

Si non, ajoutez-le.)

où:

  • AppBundle est exactement votre "AppBundle" dans Symfony 2.7
  • Meeting est la table cible (sensible à la casse des chameaux)

POUR ÊTRE SÛR, consultez ce répertoire:

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

ET ASSUREZ-VOUS que vous ne disposez que de fichiers .xml pour la table pour laquelle vous souhaitez créer des fichiers de classe d'entités, et aucun autre. Puis exécutez cette commande ci-dessous pour générer des méthodes get et set pour votre classe d'entité créée précédemment

$ php app/console doctrine: générer: entités AppBundle: Meeting --no-backup

NOTE2: À la dernière étape, vous devez supprimer le fichier xml doctrine orm db, 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

12
Dung

Le commentaire de @ fyrye qui est actuellement caché mérite le crédit, je voulais l'ajouter afin que les autres ne l'aient pas manqué. C'est l'approche:

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

// for excluding an specific table
$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 l'indicateur --filter ne filtre qu'après avoir lu les métadonnées de toutes vos tables qui, si elles ne possèdent pas de clé primaire ou d'autre problème, feront échouer la commande.

8
Carlton

Aucune des réponses ne me convenait parfaitement avec Symfony. 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
5
Brett Thomas

Fonctionne également très bien avec Symfony 3.

Si vous obtenez "Pas de classes de métadonnées à traiter". message essayez de convertir votre nom de fichier en Doctrine camel dans le paramètre filter.

"my_table_name" doit être écrit en tant que "MyTableName".

3
Ivo Necchi

J'aurais laissé cela comme un commentaire sur la réponse acceptée, mais je suis un débutant.

Pour ceux qui comme moi ont eu des problèmes avec le commutateur --filter qui mappe plusieurs tables avec des chaînes coïncidentes dans les noms, on peut utiliser un modèle.

Exemple de noms de table:

Vendeur VendeurContact

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

Cette commande convertira les deux tables plutôt que simplement Vendor. Si vous voulez juste Vendor et non VendorContact, utilisez un motif dans --filter:

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

J'espère que ça aide quelqu'un!

3
peej

J'ai eu exactement le même problème avec Symfony 2.4 et MySQL.

Aucune des solutions de contournement affichées ci-dessus n'a fonctionné pour moi.

J'ai fini par créer une nouvelle base de données avec les tables que je veux extraire (cela peut être facile à faire car MySQL fournit le script de création).

Puis modifié la connexion à cette nouvelle base de données et exécuté la commande d'extraction d'entité à partir de là.

Cela semble être un peu radical, mais je ne créerai pas les entités à la main.

J'espère que ça t'as aidé

1
Nicolas

pour Symfony 3

Pour générer les entités pour une nouvelle table "Groupe"

php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/AppBundle/Entity --filter Group

enter image description here

comme écrit dans le documentation de symfony

0
max4ever

Cela n'a pas fonctionné pour mon symfony 3.3. Je viens donc de créer une copie du répertoire et de re-générer toutes les entités du répertoire de copie. Ensuite, j'ai copié les entités requises dans mon répertoire d'origine.

--filter ne fonctionne pas à cause de ce problème https://github.com/symfony/symfony/issues/7717

0
hanish singla