Détails du sujet

Symfony 3 [Quiz 2] [Pile 5]

Doctrine dans le FrameWork Symfony 3

Toutes les cartes

Doctrine

Si on utilise la ligne de commande suivante pour créer une entité, cela générera-t-il aussi la classe Repository de l'entité?

>php bin/console doctrine:generate:entity

Oui


Doctrine

Quel Bundle doit-on installer afin de pouvoir exécuter nos fixtures en ligne de commande et ainsi remplire notre base de données?

DoctrineFixturesBundle

 

Le Bundle de Fixtures de Doctrine


Doctrine

Quelles sont les étapes d'installation et d'utilisation des fixtures?

  • 1. Installer le Bundle en ligne de commande:
  • >php composer.phar require --dev doctrine/doctrine-fixtures-bundle
  • 2. Ajouter le Bundle dans app/AppKernel.php
  • 3. Ecrire sa fixture dans scr\NomDuBundle\DataFixtures\ORM\LoadNomEntité
  • 4. Exécuter sa fixture en ligne de commande
  • >php bin/console doctrine:fixtures:load

 


Doctrine - Est-ce le bon ordre d'exécution?
  • >php bin/console doctrine:database:create
  • >php bin/console doctrine:schema:upate --dump-sql
  • >php bin/console doctrine:schema:upate --force
  • >php bin/console doctrine:fixtures:load

Oui


Doctrine

Peut-on indiquer à Doctrine l'ordre de chargement de nos fixtures afin de les exécuter dans l'ordre désiré?

Oui


Doctrine

Une simple fixture sans partage d'objets doit

  • Implémenter quelle interface?
  • et
  • Utiliser quelle méthode?
  • Implémenter l'Interface FixtureInterface
  • Utiliser la méthode load(ObjectManager $manager)

Doctrine

Une fixture qui partage des objets doit

  • Etendre quelle classe?
  • Implémenter quelle interface?
  • et
  • Utiliser quelles méthodes?
  • Etendre la classe: AbstractFixture
  • Implémenter l'interface: OrderedFixturesInterface
  • Méthodes: load() et getOrder()

Doctrine

Quelle est l'utilité des Fixtures?

Elles sont utiles pour charger un lot contrôlé de données dans une base de données afin de la tester ou de la remplir correctement.


Doctrine

Symfony possède-t-il par défaut le Bundle qui lui permet d'utiliser les fixtures?

Non


Doctrine

Que sont les fixtures?

Des classes PHP dans lesquels on crée des objets (instances d'entité) pour les persister en base de données.


Doctrine-Fixtures-ORM

Dans quel répertoire doit-on écrire nos fixtures?

Dans le répertoire

scr\NomDuBundle\DataFixtures\ORM


Doctrine - Fixtures

Peut-on parfois avoir besoin de charger des services dans nos fixtures?

Oui


Doctrine - Fixtures

Quelle interface doit-on utiliser en plus de l'interface ''FixtureInterface'' pour pouvoir charger nos services dans nos fixtures?

L'Interface ''ContainerAwareInterface''


Doctrine - Fixtures

Quels sont les 3 types de Fixtures?

  1. Les simples Fixtures qui n'utilisent pas le partage d'objets et le chargement ordonné
  2. Les Fixtures qui utilisent le partage d'objets et le chargement ordonné
  3. Les Fixtures qui utilisent des services avec l'aide du container

Doctrine

Qu'est-ce qu'une relation Many To Many?

C'est une relation que permet à plusieurs intances d'une entité d'être en relation avec plusieurs intances d'une autre entité.


Doctrine

Pour une relation Many To Many entre deux entités, Doctrine créra-t-il une table intermédiaire?

Oui


Doctrine

Quand on utilise Doctrine, utilise-t-on des objets dans notre code et Doctrine s'occupe-t-il de la base de données?

Oui


Doctrine

Dans une relation Many To Many unidirectionnelle entre deux entités A et B, l'entité A propriétaire a-t-elle un attribut qui contient une instance de ArrayCollection afin de pouvoir contenir toutes les instances de l'entité B?

Oui

Le nom de cet attribut est le nom de l'entité B au pluriel.


Doctrine

Dans une relation Many To Many bidirectionnelle entre deux entités A et B, chaque entité a-t-elle un attribut qui contient une instance de ArrayCollection afin de contenir toutes les instances de l'autre entité?

Oui
  • L'entité A contiendra un attribut 'NomDeEntitéB' au pluriel
  • L'entité B contiendra un attribut 'NomDeEntitéA' au pluriel

Doctrine

Que doit-on faire dans le constructeur d'une entité A qui est liée de manière OneToMany ou ManyToMany à une entité B?

L'attribut qui recevra les instances de l'entité B doit contenir une instance de ArrayCollection.


Doctrine-Commentez la ligne 10

Une relation ManyToMany existe entre l'entité Advert et Category.

Un ''persiste'' de l'entité Advert entraine un ''persiste'' de l'entité Category.


Doctrine-Soit le constructeur suivant d'une entité

Quelles sont les 3 méthodes pour cet attribut categories?

  1. getCategories()
  2. addCategory(Category $category)
  3. removeCategory(Category $category)

Doctrine - Fixtures

La ligne de commande suivante videra-t-elle toute la base de données avant de charger les fixtures?

>php bin/console doctrine:fixtures:load

Oui


Doctrine - Fixtures

Quelle est la ligne de commande qui nous permet de charger nos fixtures sans vider la base de données avant?

>php bin/console doctrine:fixtures:load --append

 


Doctrine - Twig

Dans un template Twig peut-on utiliser la méthode ''empty'' de la classe ArrayCollection pour savoir si une liste d'instances d'une entité est vide?

Oui - Comme l'exemple de la ligne 3

Doctrine

Qu'est-ce qu'une relation ManyToMany avec attribut?

C'est une relation ManyToMany entre deux entités A et B que l'on complète avec une information supplémentaire située dans un attribut.

Cet attribut se trouve dans une entité supplémentaire AB que l'on met en relation avec les entités A et B sous la forme de deux relations OneToMany et ManyToOne.

One (A) To Many (AB)     Many (AB) To One (B)


Doctrine

Quel est l'objectif d'une relation bidirectionnelle?

C'est de rendre possible l'accès à l'entité propriétaire depuis l'entité inverse.


Doctrine

Etapes 1 et 2 sont-elles utilisées pour lier 2 entités A et B en ManyToMany Bidirectionnelle?

  • 1- Créer l'entité A propriétaire en ligne de commande
  • Ajouter dans l'entité A l'attribut qui représente les futurs instances de l'entité B et l'annoter avec ManyToMany, targetEntity, inversedBy et lui affecter une instance de ArrayCollection dans son constructeur.
  • 2- Créer l'entité B inverse en ligne de commande
  • Ajouter dans l'entité B l'attribut qui représente les futurs instances de l'entité A et l'annoter avec ManyToMany, targetEntity, mappedBy et lui affecter une instance de ArrayCollection dans son constructeur.

Oui


Doctrine

Dans le repository d'une entité A, quelle ligne de code plus simple est équivalente à:

$this->_em->createQueryBuilder()

->select('a')->from($this->_entityName,  'a')

$this->createQueryBuilder('a')


Doctrine

Dans la méthode d'un contrôleur comment récupérer le repository d'une entité A?

$em = $this->getDoctrine()->getManager();

$repository = $em->getRepository('NomDuBundle:NomEntité');


Doctrine

La classe repository d'une entité, hérite de quelle classe?

La classe

\Doctrine\ORM\EntityRepository


Doctrine

Citez quelques méthodes de la classe EntityRepository

  • createQueryBuilder( string $alias, string $indexBy = null )
  • find( mixed $id, integer|null $lockMode = null, integer|null $lockVersion = null )
  • findAll( )
  • findBy( array $criteria, array $orderBy = null, integer|null $limit = null, integer|null $offset = null )
  • findOneBy( array $criteria, array $orderBy = null )

Doctrine

Citez deux méthodes émulées, prises en charge par la méthode magique __call() de la classe EntityRepository.

  • findByX($valeur)  
  • findOneByX($valeur)  

Où X est le nom d'une propriété de l'entité


Doctrine

Quelle méthode est strictement égale à

findBy(array('author' => 'Alexandre'))

findByAuthor('Alexandre')


Doctrine

Quelles sont les deux manières de récupération de nos entités depuis un repository?

  1. En DQL (Doctrine Query Language)
  2. En utilisant le QueryBuilder

Doctrine

Quel est l'avantage d'utiliser le queryBuilder pour récupérer ses entités?

On peut construire sa requête en plusieurs étapes


Doctrine

Toutes les fonctions SQL sont-elles implémentées en DQL?

Non


Doctrine

Citez quelques méthodes de la classe QueryBuilder

  • select($select = null)
  • addSelect($select = null)
  • delete($delete = null, $alias = null)
  • update($update = null, $alias = null)
  • set($key, $value)
  • from($from, $alias, $indexBy = null)
  • join($join, $alias, $conditionType = null, $condition = null, $indexBy = null)
  • innerJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null)
  • leftJoin($join, $alias, $conditionType = null, $condition = null, $indexBy = null)
  • where($where)
  • andWhere($where)
  • orWhere($where)
  • groupBy($groupBy)
  • addGroupBy($groupBy)
  • having($having)
  • andHaving($having)
  • orHaving($having)
  • orderBy($sort, $order = null)
  • addOrderBy($sort, $order = null)

Doctrine

De manière générale, où doit-on faire nos requêtes afin de récupérer nos entités?

Dans le repository de l'entité.


Doctrine

Dans un contrôleur, peut-on récupérer une entité en utilisant des méthodes basiques du repository de l'entité?

Oui

Doctrine

Quels sont les moyens dont-on dispose pour récupérer nos entités situées dans notre BDD?

  • 1-Dans un contrôleur: Utilisation des méthodes de bases (find(), findAll()..) du repository de l'entité
  • 2-Dans le repository de l'entité: Utilisation du langage DQL
  • 3-Dans le repository de l'entité: Utilisation du QueryBuilder
    pour construire nos requêtes

Doctrine

Généralement, dans notre contrôleur, utilise-t-on nos méthodes personnelles définies dans les repository de nos entités, pour récupérer nos données de BDD?

Oui


Doctrine

Que doit-on faire pour éviter au maximum les requêtes dans un template?

  • Faire en sorte que le contrôleur retourne une réponse qui contienne le maximum des données qui doivent être affichées dans le template.
  • Les requêtes avec jointures sont trés souvent utilisées pour atteindre cet objectif.
  • On évite ainsi les requêtes secondaires dans le template.

Commentez les lignes du repository de l'Entité Advert
  • Création de notre méthode personnelle pour récupérer tous les adverts qui sont dans la catégorie Graphisme.
  • On utilise le QueryBuilder afin de faire une jointure entre l'entité Advert et l'entité Category.

Doctrine

Quelle est la différence entre l'objet

QueryBuilder

et

Query?

  • QueryBuilder est l'ojet qui permet de construire une Query
  • Query est l'objet à partir duquel on extrait les résultats

Doctrine

Citez quelques méthodes de l'objet Query.

  • getResult()
  • getArrayResult()
  • getScalarResult()
  • getOneOrNullResult()
  • getSingleResult()
  • getSingleScalarResult()
  • execute()

Doctrine

Depuis un repository, quelle méthode du gestionnaire d'entité utilise-t-on pour créer une requête DQL?

La méthode createQuery()
  • $query = $this->_em->createQuery("SELECT a FROM NomBundle:NomEntité a")

Doctrine

Lorsque l'on fait des requêtes DQL doit-on toujours donner des alias à nos entités?

Oui

Doctrine

Comment tester la requête DQL suivante en ligne de commande?

"SELECT a FROM CoreBundle:Advert a"

>php bin/console doctrine:query:dql "SELECT a FROM CoreBundle:Advert a"


Doctrine - Vrai ou Faux

Si l'on utilise une entité dont on a récupère les entités liées avec une jointure, pourra-t-on se servir de ses assesseurs sans craindre des requêtes supplémentaires?

Oui