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 !
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.
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();
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 ?
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)