query builderで次のコードを使用して、スコア値の平均と、その平均が属するカテゴリエンティティを選択しています。
$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'が定義されていることがわかります。これはルートエンティティ(スコア)である必要があります。
何が間違っているのでしょうか?
createQueryBuilder()は、一致するエンティティーのリポジトリーから呼び出されたときにのみパラメーターを受け取ることができます。このリポジトリから呼び出さない場合は、fromメソッドを定義する必要があります。
->from('YourMappingSpace:Campsite', 's')
パラメータをcreateQueryBuilder()に渡すことは、とにかく便利です。いつでも手動で定義できます。関数は次のようになります(エンティティリポジトリ内のみ)。
public function createQueryBuilder($alias)
{
return $this->_em->createQueryBuilder()
->select($alias)
->from($this->_entityName, $alias);
}