2015-03-02 14 views
5

Sto lavorando al piccolo progetto utilizzando Symfony 2.5 e Doctrine. La mia query viene eseguita perfettamente in MySQL Workbench. Purtroppo nella dottrina ottengo l'errore sotto quando uso parentesi nel mio generatore di query:Utilizzo di parentesi (>) in Symfony 2.5 e Doctrine query builder

  • QueryException: [Errore di sintassi] linea 0, col 19: Errore: Previsto Doctrine \ ORM \ Query \ Lexer :: T_CLOSE_PARENTHESIS, ha ottenuto '>'

    $grades = $qb 
           ->select(array(
            'SUM(g.final > 89.5) as a',        
            'CONCAT (gcs.number, gcs.letter) as class' 
           )) 
           ->from('FicusEschoolBundle:Grade', 'g') 
           ->leftJoin('g.course', 'gc') 
           ->leftJoin('gc.schoolclass', 'gcs') 
           ->where($qb->expr()->eq('gc.subject', $rid)) 
           ->andWhere($qb->expr()->in('g.quarter', $filterQuarter)) 
           ->groupBy('gc') 
           ->orderBy('gcs.number') 
           ->getQuery() 
           ->getArrayResult(); 
    

risposta

1

dalla dottrina impostazione predefinita non permette di avere condizioni logiche all'interno di funzioni di aggregazione. È possibile utilizzare beberlei/DoctrineExtensions o se non si desidera installare l'intera libreria, aggiungere solo la singola condizione IF: https://github.com/beberlei/DoctrineExtensions/blob/master/lib/DoctrineExtensions/Query/Mysql/IfElse.php.

Per registrare la funzione DQL personalizzate:

# app/config/config.yml 
doctrine: 
    orm: 
     # ... 
     dql: 
      string_functions: 
       test_string: AppBundle\DQL\StringFunction 
       second_string: AppBundle\DQL\SecondStringFunction 
      numeric_functions: 
       test_numeric: AppBundle\DQL\NumericFunction 
      datetime_functions: 
       test_datetime: AppBundle\DQL\DatetimeFunction 

Fonte: http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html

1

Non è possibile specificare una condizione nella Doctrine2 DQL somma operatore di selezione, BTW è possibile filtrare solo chi ha la somma maggiore di il tuo limite. Prova questo:

$grades = $qb 
       ->select(array(
        'SUM(g.final) as a',        
        'CONCAT (gcs.number, gcs.letter) as class' 
       )) 
       ->from('FicusEschoolBundle:Grade', 'g') 
       ->leftJoin('g.course', 'gc') 
       ->leftJoin('gc.schoolclass', 'gcs') 
       ->where($qb->expr()->eq('gc.subject', $rid)) 
       ->andWhere($qb->expr()->in('g.quarter', $filterQuarter)) 
       ->having(
        $qb->expr()->gt(
           $qb->expr()->sum('g.final'), 89.5 
            ) 
       ) 
       ->groupBy('gc') 
       ->orderBy('gcs.number') 
       ->getQuery() 
       ->getArrayResult(); 

Spero che questo aiuto

+0

query È produrrà risultati errati a causa 'SUM (g.final> 89,5)' non è equivalente a 'SUM (g.final)> 89.5' –

+0

Sì, lo so, ho descritto questa query come soluzione alternativa, grazie per il chiarimento – Matteo

0

Grazie ragazzi. Finalmente sembra che abbia risolto da solo. Inoltre non sono sicuro che sia corretto. Per ora mostra la risposta corretta.

originale query MySQL che funziona perfettamente:

SELECT avg(final) as Final, SUM(Final>89.5) as a, SUM(Final<89.5 AND Final>79.5) as b, SUM(Final<79.5 AND Final>69.5) as c, SUM(Final<69.5 AND Final>59.5) as d , SUM(Final<59.5) as f, Ca.letter, Ca.number, subject_id FROM grades as G join courses as C on G.course_id = C.id join schoolclasses as Ca on Ca.id=C.schoolclass_id where C.subject_id = 1 and G.quarter_id in (1, 2) group by G.course_id 

ho provato a convertire DQL. Sfortunatamente a causa tua non è stato possibile utilizzare la parentesi nella funzione aggregata di Doctrine. Questo è il modo in cui ho risolto. Ora conta tutti A, B, C, D, F dalla tabella dei voti. E le informazioni sulla classe della scuola (lettera e numero) sono state recuperate dalla sua tabella principale. I gradi A, B, C, D, F non sono esattamente il campo che volevo. È uguale all'immagine qui sotto. enter image description here

Si potrebbe tipo di trucco

$rsm = new ResultSetMapping(); 
      $rsm->addEntityResult('Ficus\EschoolBundle\Entity\Grade', 'g'); 
      $rsm->addFieldResult('g', 'Final', 'final'); 
      $rsm->addFieldResult('g', 'A', 'a'); 
      $rsm->addFieldResult('g', 'B', 'b'); 
      $rsm->addFieldResult('g', 'C', 'c'); 
      $rsm->addFieldResult('g', 'D', 'd'); 
      $rsm->addFieldResult('g', 'F', 'abcd'); 
      $rsm->addFieldResult('g', 'Class', 'a1'); 
      //$query = $this->getEntityManager()->createNativeQuery('SELECT avg(final) as Final, SUM(Final>89.5) as a, SUM(Final<89.5 AND Final>79.5) as b, SUM(Final<79.5 AND Final>69.5) as c, SUM(Final<69.5 AND Final>59.5) as d , SUM(Final<59.5) as f, Ca.letter, Ca.number, subject_id FROM grades as G join courses as C on G.course_id = C.id join schoolclasses as Ca on Ca.id=C.schoolclass_id where C.subject_id = 1 and G.quarter_id=1 group by G.course_id', $rsm); 
      $query = $this->getEntityManager()->createNativeQuery('' 
        . 'SELECT avg(g.final) as Final, ' 
        . 'SUM(Final>89.5) as A, ' 
        . 'SUM(Final<89.5 AND Final>79.5) as B, ' 
        . 'SUM(Final<79.5 AND Final>69.5) as C, ' 
        . 'SUM(Final<69.5 AND Final>59.5) as D, ' 
        . 'SUM(Final<59.5) as F, ' 
        . 'CONCAT(ca.number, ca.letter) as Class ' 
        . 'FROM grades as g ' 
        . 'JOIN courses as c on g.course_id = c.id ' 
        . 'JOIN schoolclasses as ca on ca.id = c.schoolclass_id ' 
        . 'WHERE c.subject_id = ? AND g.quarter_id in (?) group by g.course_id ' 
        . 'ORDER BY ca.number, ca.letter ', $rsm); 
      $query->setParameter(1, $rid); 
      $query->setParameter(2, $filterQuarter); 

      $grades = $query->getArrayResult(); 
Problemi correlati