Doctrine orm 原则:如果不选择至少一个根实体别名,则无法通过标识变量选择实体

Doctrine orm 原则:如果不选择至少一个根实体别名,则无法通过标识变量选择实体,doctrine-orm,doctrine,doctrine-query,Doctrine Orm,Doctrine,Doctrine Query,我在查询生成器中使用以下代码来选择分数值的平均值以及该平均值所属的类别实体: $queryBuilder = $this->createQueryBuilder('s') ->resetDQLPart('select') ->select('AVG(s.score) as score, partial c.{reviewCategoryID} as cat') ->setParameter('status', ReviewStatusType::A

我在查询生成器中使用以下代码来选择分数值的平均值以及该平均值所属的类别实体:

$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
是评审所属的实体,而分数属于评审,分数有一个类别

但是当我尝试执行这个时,我得到了错误

Error: Cannot select entity through identification variables without choosing at least one root entity alias.
当我调试并检查根别名时,我看到定义了“s”,它应该是根实体(Score)

知道可能有什么问题吗?

createQueryBuilder()只能在从匹配实体的存储库调用时接受参数。如果您不从这个存储库调用它,您应该定义一个from方法

->from('YourMappingSpace:Campsite', 's')
无论如何,将参数传递给createQueryBuilder()是为了保持一致性。您始终可以手动定义它。函数如下所示(仅在实体存储库中):

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