21

クエリ ビルダーで次のコードを使用して、スコア値の平均と、その平均が属するカテゴリ エンティティを選択しています。

$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」が定義されていることがわかります。

何が間違っている可能性がありますか?

4

1 に答える 1

18

createQueryBuilder() は、一致するエンティティのリポジトリから呼び出された場合にのみパラメーターを受け取ることができます。このリポジトリから呼び出さない場合は、from メソッドを定義する必要があります。

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

パラメータを createQueryBuilder() に渡すのは、とにかく便利です。いつでも手動で定義できます。関数は次のようになります (エンティティ リポジトリ内のみ)。

public function createQueryBuilder($alias)
{
    return $this->_em->createQueryBuilder()
        ->select($alias)
        ->from($this->_entityName, $alias);
}
于 2013-08-04T19:59:46.500 に答える