web-dev-qa-db-fra.com

Comment faire parti rejoindre dans Doctrine?

C'est ma fonction où j'essaie de montrer l'historique de l'utilisateur. Pour cela, je dois afficher les crédits actuels de l'utilisateur ainsi que son historique de crédit.

C'est ce que j'essaie de faire:

 public function getHistory($users) {
    $qb = $this->entityManager->createQueryBuilder();
    $qb->select(array('a','u'))
            ->from('Credit\Entity\UserCreditHistory', 'a')
            ->leftJoin('User\Entity\User', 'u', \Doctrine\ORM\Query\Expr\Join::WITH, 'a.user = u.id')
            ->where("a.user = $users ")
            ->orderBy('a.created_at', 'DESC');

    $query = $qb->getQuery();
    $results = $query->getResult();

    return $results;
}

Cependant, j'obtiens cette erreur:

[Erreur de syntaxe] ligne 0, col 98: Erreur: Doctrine attendue\ORM\Query\Lexer :: T_WITH, activé '

Edit: J'ai remplacé 'ON' par 'WITH' dans la clause de jointure et ce que je vois maintenant ne représente qu'une valeur de la colonne jointe.

50
noobie-php

Si vous avez une association sur une propriété qui pointe vers l'utilisateur (disons Credit\Entity\UserCreditHistory#user, choisi dans votre exemple), alors la syntaxe est assez simple:

public function getHistory($users) {
    $qb = $this->entityManager->createQueryBuilder();
    $qb
        ->select('a', 'u')
        ->from('Credit\Entity\UserCreditHistory', 'a')
        ->leftJoin('a.user', 'u')
        ->where('u = :user')
        ->setParameter('user', $users)
        ->orderBy('a.created_at', 'DESC');

    return $qb->getQuery()->getResult();
}

Puisque vous appliquez une condition au résultat joint ici, utilisez un LEFT JOIN ou simplement JOIN est identique.

Si aucune association n'est disponible, la requête se présente comme suit

public function getHistory($users) {
    $qb = $this->entityManager->createQueryBuilder();
    $qb
        ->select('a', 'u')
        ->from('Credit\Entity\UserCreditHistory', 'a')
        ->leftJoin(
            'User\Entity\User',
            'u',
            \Doctrine\ORM\Query\Expr\Join::WITH,
            'a.user = u.id'
        )
        ->where('u = :user')
        ->setParameter('user', $users)
        ->orderBy('a.created_at', 'DESC');

    return $qb->getQuery()->getResult();
}

Cela produira un ensemble de résultats ressemblant à ce qui suit:

array(
    array(
        0 => UserCreditHistory instance,
        1 => Userinstance,
    ),
    array(
        0 => UserCreditHistory instance,
        1 => Userinstance,
    ),
    // ...
)
102
Ocramius