Ma Relation ManyToMany n’est pas persisté.

La persistance de la relation ManyToMany avec doctrine n’est pas bidirectionnelle.

Il y a un côté maitre et un côté esclave. Seule la sauvegarde du côté maitre entrainera la sauvegarde du côté esclave.

Exemple :

<?php

class Article
{

    /**
    * @ManyToMany(targetEntity="Tag", inversedBy="articles")
    * @JoinTable(name="article_tag")
    **/
    private $tags;

}

class Tag
{

    /**
    * @ManyToMany(targetEntity="Article", mappedBy="tags")
    **/
    private $articles;

}

Dans cet exemple, c’est la classe Article qui est maitresse.

Lorsque l’on persistera la classe Article, les liaisons avec la classe Tag seront persistées elle aussi. Ce n’est pas le cas quand on persiste la classe Tag (il faudra développer du code spécifique)

Les différents moyens d’exécution d’une requête Doctrine2

Pour exécuter une requête Doctrine, il y’a plusieurs façons de faire à partir du Query Builder Doctrine2.

Doctrine2: Récupérer une collection de résultats

Exemple de requête à exécuter:

  $q = $this->createQueryBuilder('p')
->where('p.state = :state')
->setParameter('state', $state);

Récupérer tous les posts valides.

$q->getQuery()->execute();

Va permettre de retourner une collection d’objets (\Doctrine\Common\Collections\ArrayCollection()) de notre entité Post.

execute() a un équivalent:

$q-&gt;getQuery()->getResult()

Doctrine2: Récupérer un seul résultat

Si nous souhaitons récupérer une seule entrée avec Doctrine dans Symfony2:

$q = $this->createQueryBuilder('p')
->where('p.id = :post')
->setParameter('post', $idPost);

Il suffit d’utiliser getSingleResult() ou getOneOrNullResult().

$q->getQuery()->getOneOrNullResult()

L’avantage de getOneOrNullResult() et qu’il retournera null si aucune donnée n’est trouvée, contrairement à getSingleResult() qui déclenchera une erreur.

Doctrine2: Récupérer uniquement une valeur

Dans le cas d’un count() par exemple, nous ne souhaitons récupérer qu’une seule valeur avec notre requête:

$q = $this->createQueryBuilder('p')
          ->select('COUNT(p)');
On exécute la requête du Query Builder avec getSingleScalarResult()
$q->getQuery()->getSingleScalarResult();

Doctrine2: Récupérer les données en tableau

Et si vous ne souhaitez pas récupérer vos données sous forme d’objet, vous pouvez les récupérer formatées en tableau:
   $q = $this->createQueryBuilder('p')
->where('p.state = :state')
->setParameter('state', $state);

Récupérer tous les posts valides.

$q->getQuery()->getScalarResult();
OU
$q->getQuery()->getArrayResult();