Requete Relation MayToMany

Par Ikemad, il y a 9 ans


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

Ikemad, il y a 9 ans

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 ...

yanis-git, il y a 9 ans

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();
yanis-git, il y a 9 ans

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, il y a 9 ans

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)

yanis-git, il y a 9 ans

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