2015-03-02 26 views
5

Symfony 2.5 ve Doctrine kullanarak küçük proje üzerinde çalışıyorum. Benim sorgu MySQL Workbench mükemmel çalışır. Maalesef doktrininde benim sorgu oluşturucu parantez kullandığınızda aşağıdaki hatayı alıyorum:Symfony 2.5 ve Doctrine sorgu oluşturucudaki parantezleri (>) kullanma

  • QueryException: [Dizimi Hatası] hat 0, col 19: Hata: Beklenen Doktrin \ ORM \ Sorgu \ Lexer :: T_CLOSE_PARENTHESIS, got '>' varsayılan Doktrini ile

    $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(); 
    

cevap

1

toplama işlevleri içindeki mantıksal koşullara sahip izin vermez. beberlei/DoctrineExtensions veya tüm kitaplığı yüklemek istemiyorsanız, yalnızca IF koşulunu ekleyin: https://github.com/beberlei/DoctrineExtensions/blob/master/lib/DoctrineExtensions/Query/Mysql/IfElse.php.

# 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 

Kaynak: Sen Doctrine2 DQL toplamı seçme operatörü bir durumu belirtmek olamaz http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html

1

, BTW daha toplamı büyük olan tek kim filtre

özel DQL fonksiyonunu kaydetmek için sınırın Bu deneyin:

$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(); 

Umut

+0

Sorgu yanlış sonuçlar üretecek kandırmak olabilir 89.5' –

+0

Evet, biliyorum, bu sorguyu bir çözüm olarak tanımladım, Açıklama için teşekkürler – Matteo

0

Teşekkür ederim çocuklar bu yardım. Sonunda kendi başıma çözdüğüm anlaşılıyor. Ayrıca doğru olduğundan emin değilim. Şimdilik doğru cevabı gösterir. Mükemmel çalışıyor

Orjinal MySQL sorgusu:

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 

Ben DQL dönüştürmek çalıştı. Maalesef sizden parantez, Doctrine'nin toplu işlevinde kullanamadı. Çözdüğüm yol buydu. Şimdi not tablosundan tüm A, B, C, D, Fleri sayar. Okul sınıfı (mektup ve numara) bilgileri üst tablosundan alındı. A, B, C, D, F notları istediğim alan değil. Aşağıdaki görüntü ile aynı. SUM (> 89.5 g.final) `> (g.final) SUM` eşdeğer değildir `çünkü enter image description here

Biraz

$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();