2013-07-26 5 views
13

Korzystam z poniższego kodu w konstruktora zapytań, aby wybrać średnią wartości wyników, a encja kategorii, do której należy ta średnia :Doctrine: Nie można wybrać encji za pomocą zmiennych identyfikacyjnych bez wybrania co najmniej jednego aliasu jednostki głównej

$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 jest podmiotem, do którego należy ocena, natomiast wyniki należą do przeglądu, a wyniki mają kategorię.

Ale gdy próbuję wykonać to pojawia się błąd

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

Kiedy debugowania i sprawdzić aliasy korzeniowych, widzę, że „s” jest zdefiniowany, który powinien być podmiot root (Wynik).

Każdy pomysł co może być nie tak?

Odpowiedz

11

createQueryBuilder() może przyjąć tylko parametr, gdy jest wywoływana z repozytorium podmiotu pasującego. W przypadku nie nazywają go z tego repozytorium należy zdefiniować od metody.

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

Przekazanie parametru do createQueryBuilder() jest mimo wszystko dla wygody. Zawsze można zdefiniować go ręcznie. Funkcja wygląda tak (tylko wewnątrz repozytorium podmiotu):

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