web-dev-qa-db-fra.com

Doctrine: impossible de sélectionner une entité via des variables d'identification sans choisir au moins un alias d'entité racine

J'utilise le code suivant dans le générateur de requêtes, pour sélectionner une moyenne des valeurs de score et l'entité de catégorie à laquelle appartient cette moyenne:

$queryBuilder = $this->createQueryBuilder('s')
    ->resetDQLPart('select')
    ->select('AVG(s.score) as score, partial c.{reviewCategoryID} as cat')
    ->setParameter('status', ReviewStatusType::ACCEPTED)
    ->join('s.review', 'r')
    ->join('s.category', 'c')
    ->where('r.campsite = :campsite')
    ->andWhere('r.status = :status')
    ->setParameter('campsite', $campsite)
    ->groupBy('c.reviewCategoryID');

$campsite est une entité à laquelle appartient un avis, tandis que les notes appartiennent à un avis et les notes ont une catégorie.

Mais quand j'essaye d'exécuter cela, j'obtiens l'erreur

Error: Cannot select entity through identification variables without choosing at least one root entity alias.

Lorsque je débogue et que je vérifie les alias racine, je vois que "s" est défini, ce qui devrait être l'entité racine (Score).

Une idée de ce qui pourrait être faux?

18
Michel Maas

createQueryBuilder () ne peut prendre un paramètre que lorsqu'il est appelé à partir du référentiel de l'entité correspondante. Si vous ne l'appelez pas à partir de ce référentiel, vous devez définir une méthode from.

->from('YourMappingSpace:Campsite', 's')

Passer un paramètre à createQueryBuilder () est de toute façon pratique. Vous pouvez toujours le définir manuellement. La fonction ressemble à ceci (uniquement à l'intérieur du référentiel d'entités):

public function createQueryBuilder($alias)
{
    return $this->_em->createQueryBuilder()
        ->select($alias)
        ->from($this->_entityName, $alias);
}
14
Flip