Bonjour à tous,
je séche sur une requête, je sens que la solution est simple mais je n'y arrive pas :
J'ai une entité Annonce liée à une entité Tag via une relation ManyToMany :

class Annonce
{
      /**
       * @var ArrayCollection
       * 
       * @ORM\ManyToMany(targetEntity="Tag", inversedBy="adverts", cascade={"persist"})
     * @ORM\JoinTable(name="annonce_tag")
       */
      private $tags;
    }

class Tag
{
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=50)
     */
    private $name;

       /**
       * @var ArrayCollection
       * 
       * @ORM\ManyToMany(targetEntity="Advert", mappedBy="tags", cascade={"persist"})
       */
    private $adverts
}

Mon problème est de parvenir à récupérer des annonces via l'attribut $name de Tag, je ne parviens pas à trouver une manière de le faire .
Je vous donne pour exemple une requete que j'effectue mais qui ne me retourne aucun résultat :

SELECT 
  p0_.id AS id_0, 
  p0_.title AS title_1, 
  p0_.slug AS slug_2, 
  p0_.price AS price_3, 
  p0_.date AS date_4, 
  p0_.description AS description_5, 
  p0_.published AS published_6, 
  p0_.expiredAt AS expiredAt_7, 
  p1_.id AS id_8, 
  p1_.name AS name_9, 
  p1_.slug AS slug_10, 
  p0_.category_id AS category_id_11, 
  p0_.location_id AS location_id_12 
FROM 
  platform_annonce p0_ 
  INNER JOIN annonce_tag a2_ ON p0_.id = a2_.annonce_id 
  INNER JOIN platform_tag p1_ ON p1_.id = a2_.tag_id 
WHERE 
  p1_.name IN ('test', 'tag') 
ORDER BY 
  p0_.date DESC

Merci d'avance !

5 réponses


Il semble qui manque la reflection coté Tags. Je ne sais pas si elle est créé par défaut, dans le doute je te met un lien vers la doc.

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-unidirectional-with-join-table

Ceux-ci devrait te retourner une collection de Annonce associé aux tags voulus. (Attention ! code non testé)

$this->createQueryBuilder("a")//a est un alias de Annonce
                ->join("a.tags", "t") // d'où la jointure
                ->where('t..name IN(:tags)')
                ->setParameter('tags',implode(',',$tags))
                ->getQuery();
Ikemad
Auteur

Bonjour et déjà merci de votre réponse,
par reflection vous voulez parler de la bidirectionnalité de la relation ? Si oui je viens d'essayer cependant la requête ne me retourne toujours aucun résultats ...

Je parle des méta data lié à la jointure :

<?php
/** @Entity */
class User
{
    // ...

    /**
     * Many User have Many Phonenumbers.
     * @ManyToMany(targetEntity="Phonenumber")
     * @JoinTable(name="users_phonenumbers",
     *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="phonenumber_id", referencedColumnName="id", unique=true)}
     *      )
     */
    private $phonenumbers;

    public function __construct()
    {
        $this->phonenumbers = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

/** @Entity */
class Phonenumber
{
    // ...
}

As tu mis en place le joinTable tel que décrit ci-dessus ?

Ikemad
Auteur

D'accord, je comprends.
Je n'ai pas mis le joinTable tel que décrit ci dessus mais tel que décrit dans la documentation à l'onglet Many-To-Many , Bidirectional.

En effet je souhaite bien une relation manyToMany et non une OneToMany .

Quoi qu'il en soit merci pour votre aide !

(j'édite mon premier sujet avec les annotation tel qu'elle sont à ce moment)

As tu tester ma précédente requête ? Peux tu montrer exactement ton schémas de DB ?