Symfony 2: INNER JOIN on non related table with doctrine query builder
J'essaie de construire une requête avec le générateur de requête doctrine qui rejoint une table non liée comme ceci:
$query = $this->createQueryBuilder('gpr')
->select('gpr, p')
->innerJoin('TPost', 'p')
->where('gpr.contentId = p.contentId')
Mais cela ne fonctionne pas. Je reçois toujours une erreur:
Erreur: la Variable D'Identification TPost utilisée dans l'expression du chemin de jointure n'a pas été définie auparavant.
J'ai cherché ce message d'erreur et tout le monde a répondu pour utiliser l'attribut alias + table comme p. someAttribute. Mais la table que je veux rejoindre n'est pas liée dans la table je commence mon select de.
En tant que requête mysql normale, je l'écrirais comme ceci:
SELECT * FROM t_group_publication_rel gpr
INNER JOIN t_post p
WHERE gpr.content_id = p.content_id
Une idée de ce que je fais mal?
4 réponses
Aujourd'hui, je travaillais sur une tâche similaire et je me suis souvenu que j'ai ouvert ce problème. Je ne sais pas depuis quelle version de doctrine cela fonctionne mais en ce moment vous pouvez facilement rejoindre les classes enfants dans le mappage d'héritage. Donc, une requête comme celle-ci fonctionne sans aucun problème:
$query = $this->createQueryBuilder('c')
->select('c')
->leftJoin('MyBundleName:ChildOne', 'co', 'WITH', 'co.id = c.id')
->leftJoin('MyBundleName:ChildTwo', 'ct', 'WITH', 'ct.id = c.id')
->orderBy('c.createdAt', 'DESC')
->where('co.group = :group OR ct.group = :group')
->setParameter('group', $group)
->setMaxResults(20);
Je lance la requête dans ma classe parent qui utilise le mappage d'héritage. Dans mon post précédent, c'était un point de départ différent, mais le même problème si je me souviens bien.
Parce que c'était un gros problème quand J'ai commencé ce problème, je pense que cela pourrait aussi être intéressant pour d'autres personnes qui ne le savent pas.
Les jointures entre entités sans associations n'étaient pas possibles jusqu'à la version 2.4, où vous pouvez générer une jointure arbitraire avec la syntaxe suivante:
$query = $em->createQuery('SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email');
$dql = "SELECT
a, md.fisrtName , md.LastName, mj
FROM MembersBundle:Memberdata md
INNER JOIN MembersBundle:Address a WITH md = a.empID
INNER JOIN MembersBundle:Memberjob mj WITH md = mj.memberData
...
WHERE
a.dateOfChange IS NULL
AND WHERE
md.someField = 'SomeValue'";
return $em->createQuery( $dql )->getResult();
Une jointure DQL ne fonctionne que si une association est définie dans votre mappage. Dans votre cas, je dirais qu'il est beaucoup plus facile de faire une requête native et d'utiliser ResultSetMapping pour remplir vos objets.