Doctrine2-Tips

De DiouxX's Wiki
Révision datée du 27 novembre 2015 à 13:44 par Ddevleeschauwer (discussion | contributions) (Mettre à jour une entité)
Aller à : navigation, rechercher
Aide-mémoire sur l'utilisation de Donctrine2 dans Symfony2

Entité

Générer une entitée


Konsole.png
[user@ordi ~]$ php app/console generate:doctrine:entity


      Welcome to the Doctrine2 entity generator



    This command helps you generate Doctrine2 entities.

    First, you need to give the entity name you want to generate.
    You must use the shortcut notation like AcmeBlogBundle:Post.

    The Entity shortcut name:_

Grâce à ce que le générateur vous dit, vous l'avez compris, il faut entrer le nom de l'entité sous le format NomBundle:NomEntité. Dans notre cas, on entre donc OCPlatformBundle:Advert.

    The Entity shortcut name: OCPlatformBundle:Advert

    Determine the format to use for the mapping information.

    Configuration format (yml, xml, php, or annotation) [annotation]:_

Comme je vous l'ai dit, nous allons utiliser les annotations, qui sont d'ailleurs le format par défaut. Appuyez juste sur la touche Entrée.

    Configuration format (yml, xml, php, or annotation) [annotation]:

    Instead of starting with a blank entity, you can add some fields now.
    Note that the primary key will be added automatically (named id).

    Available types: array, simple_array, json_array, object,
    boolean, integer, smallint, bigint, string, text, datetime, datetimetz,
    date, time, decimal, float, blob, guid.

    New field name (press <return> to stop adding fields):_

On commence à saisir le nom de nos champs. Lisez bien ce qui est inscrit avant : Doctrine2 va ajouter automatiquement l'id, de ce fait, pas besoin de le redéfinir ici. On entre donc notre date : date.

    New field name (press <return> to stop adding fields): date
    Field type [string]:_

C'est maintenant que l'on va dire à Doctrine à quel type correspond notre propriété date. La liste des types possibles vous est donné par Symfony juste au dessus. Nous voulons une date avec les informations de temps, tapez donc datetime.

Répétez les points 3 et 4 pour les propriétés title, author et content. title et author sont de type string de 255 caractères (pourquoi pas). Content est par contre de type text.

    New field name (press <return> to stop adding fields): date
    Field type [string]: datetime

    New field name (press <return> to stop adding fields): title
    Field type [string]: string
    Field length [255]: 255

    New field name (press <return> to stop adding fields): author
    Field type [string]: string
    Field length [255]: 255

    New field name (press <return> to stop adding fields): content
    Field type [string]: text

    New field name (press <return> to stop adding fields):_

Lorsque vous avez fini, appuyez sur la touche Entrée.

    New field name (press <return> to stop adding fields):

    Do you want to generate an empty repository class [no]?_

Oui, on va créer le repository associé, c'est très pratique, nous en reparlerons largement. Entrez donc yes.

Confirmez la génération, et voilà !

    Do you want to generate an empty repository class [no]? yes


      Summary before generation


    You are going to generate a "OCPlatformBundle:Advert" Doctrine2 entity
    using the "annotation" format.

    Do you confirm generation [yes]?


      Entity generation


    Generating the entity code: OK


      You can now start using the generated code!



    C:\wamp\www\Symfony>_

Allez tout de suite voir le résultat dans le fichier Entity/Advert.php. Symfony2 a tout généré, même les getters et les setters ! Vous êtes l'heureux propriétaire d'une simple classe… avec plein d'annotations !

Mettre à jour une entité


Konsole.png
[user@ordi ~]$ php app/console doctrine:generate:entities OCPlatformBundle:Advert


Enregistrer en BDD

  • Création de l'entité
$advert = new Advert();
  • Récupération de l'EntityManager
$em = $this->getDoctrine()->getManager();
  • On dit à Doctrine de « persister » l'entité. Cela veut dire qu'à partir de maintenant cette entité (qui n'est qu'un simple objet !) est gérée par Doctrine. Cela n'exécute pas encore de requête SQL, ni rien d'autre.
$em->persist($advert);
  • On dit à Doctrine d'exécuter effectivement les requêtes nécessaires pour sauvegarder les entités qu'on lui a dit de persister précédemment.
$em->flush();
  • Notre Advert étant maintenant enregistré en base de données grâce au flush(), Doctrine2 lui a attribué un id ! On peut donc utiliser $advert->getId() dans la génération de la route, et non un nombre fixe comme précédemment.

Base de donnée

Créer la base de donnée


Konsole.png
[user@ordi ~]$ php app/console doctrine:database:create


Création de la requête


Konsole.png
[user@ordi ~]$ php app/console doctrine:schema:update --dump-sql


Générer les tables


Konsole.png
[user@ordi ~]$ php app/console doctrine:schema:update --force