2012-04-03 14 views
6

kiedy wydaje się używać parametrów w moim zapytaniu, pojawia się błądDoctrine2 wykorzystujące setParameters

Nieprawidłowa liczba parametrów: liczba zmiennych związanych nie pasuje liczbę żetonów

tutaj jest mój kod

public function GetGeneralRatingWithUserRights($user, $thread_array) 
{ 
    $parameters = array(
     'thread' => $thread_array['thread'], 
     'type' => '%'.$thread_array['type'].'%' 
    ); 

    $dql = 'SELECT p.type,AVG(p.value) 
     FROM TrackerMembersBundle:Rating p 
     GROUP BY p.thread,p.type'; 

    $query = $this->em->createQuery($dql) 
     ->setParameters($parameters); 

    $ratings = $query->execute(); 

    return $ratings; 
} 

Jak skonfigurować poprawnie tablicę parametrów?

+0

To zapytanie nie definiuje wszelkie parametry na związanie. Może literówka? @ Kuba's rozwiązanie jest dobrym przykładem, ale dla tego DQL nie potrzebujesz w ogóle parametrów :) – Ocramius

Odpowiedz

21

Nie uwzględniłeś swoich parametrów w zapytaniu.

$parameters = array(
    'thread' => $thread_array['thread'], 
    'type' => '%'.$thread_array['type'].'%' 
); 

$dql = 'SELECT p.type,AVG(p.value) 
    FROM TrackerMembersBundle:Rating p 
    WHERE p.thread=:thread 
    AND type LIKE :type 
    GROUP BY p.thread,p.type'; 

$query = $this->em->createQuery($dql) 
    ->setParameters($parameters); 

Zobacz przykłady w dokumentacji: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples

+0

Tak. Jedną z bardziej irytujących rzeczy na temat przygotowanych oświadczeń PDO jest to, że posiadanie dodatkowych parametrów wywoła błąd. – Cerad

+2

Powiedziałbym, że to dobrze. Jeśli przekazujesz więcej parametrów niż symboli zastępczych, zrobiłeś coś złego i lepiej jest o tym wiedzieć. –

3

dzięki wszystkim za swoje wysiłki, użyłem go w różny sposób za pomocą QueryBuilder

 $parameters = array(
     'thread' => $thread_array['thread'] 
     ,'type' => $thread_array['type'] 
    ); 


    $qb = $this->em->createQueryBuilder(); 
    $query = $qb 
     ->from('TrackerMembersBundle:Rating','rating') 
     ->select(' rating.type, 
     COUNT(rating.value) AS ratingcount , 
     AVG(rating.value) AS ratingaverage ') 
     ->where(
     $qb->expr()->orx(
      $qb->expr()->eq('rating.thread', ':thread'), 
      $qb->expr()->like('rating.type', ':type') 
     ) 

    ) 
     ->groupBy('rating.thread,rating.type') 
     ->setParameters($parameters) 
     ->getQuery(); 
+5

Nie rozwiązałeś go inaczej, ale używałeś innego sposobu tworzenia zapytań. To zadziałało, gdy podałeś parametry, które chcesz związać (tak jak sugerowałem). –

Powiązane problemy