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?

24
demandé sur Gray 2012-06-20 13:20:42

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.

59
répondu serious.siriso 2013-05-28 11:06:20

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');

Référence: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

4
répondu Yamir 2016-09-05 01:04:03
$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();
2
répondu Jzapata 2014-06-13 18:06:20

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.

0
répondu Peter Kruithof 2012-06-27 19:41:12