2013-07-17 68 views
1

我正在尋找方法來將我的政策按天分組。我正在嘗試很多示例如何做到這一點,但仍然存在一些錯誤。誰能幫我這個? 在這裏,我將只顯示兩個示例,其他我嘗試的示例與這些示例類似。差別只在使用SQL的功能EX(CAST,SUBSTRING,日期等) 我試圖第一種方式是:GroupDAY使用Doctrine2

$query = $this->getEntityManager() 
         ->createQueryBuilder(); 
$query->select('count(p), p.transactionDate') 
         ->from('GLPolicyBundle:Policy', 'p') 
         ->andwhere('p.shop IN (:shop_id)') 
         ->setParameter('shop_id', $shop_list) 
         ->andWhere($query->expr()->between('p.transactionDate', ':date_from', ':date_to')) 
         ->setParameter('date_from', $date_from, \Doctrine\DBAL\Types\Type::DATETIME) 
         ->setParameter('date_to', $date_to, \Doctrine\DBAL\Types\Type::DATETIME) 
         ->addGroupBy('DAY(p.transactionDate)'); 

getDQL()返回:

SELECT count(p), p.transactionDate FROM GLPolicyBundle:Policy p 
WHERE p.shop IN (:shop_id) AND (p.transactionDate BETWEEN :date_from AND :date_to) 
GROUP BY DAY(p.transactionDate) 

和錯誤是:

[Semantical Error] line 0, col 156 near 'DAY(p.transa': Error: Cannot group by undefined identification or result variable.

而第二個方法是:

$query = $this->getEntityManager() 
      ->createQuery("SELECT p, (p.transactionDate) AS group 
          FROM GLPolicyBundle:Policy p 
          WHERE p.shop IN (:shop_id) AND (p.transactionDate BETWEEN :date_from AND :date_to) 
          GROUP BY DAY(group)") 
          ->setParameter('shop_id', $shop_list) 
          ->setParameter('date_from', $date_from, \Doctrine\DBAL\Types\Type::DATETIME) 
          ->setParameter('date_to', $date_to, \Doctrine\DBAL\Types\Type::DATETIME); 

getDQL()返回:

SELECT p, (p.transactionDate) AS group FROM GLPolicyBundle:Policy p 
WHERE p.shop IN (:shop_id) AND (p.transactionDate BETWEEN :date_from AND :date_to) 
GROUP BY DAY(group) 

和錯誤是:因爲它被認爲與許多不同類型的數據庫工作

[Semantical Error] line 0, col 72 near 'FROM GLPolicyBundle:Policy': Error: Class 'FROM' is not defined.

+0

長度嘗試之前和之後的'group'使用'字符 – cheesemacfly

回答

3

主義並不支持的許多本地數據庫功能。所以你剩下三個選項。

  1. 使用NativeQuery類(http://docs.doctrine-project.org/en/latest/reference/native-sql.html
  2. 實現自定義SQL學步車。這裏是白天(https://github.com/beberlei/DoctrineExtensions/blob/master/lib/DoctrineExtensions/Query/Mysql/Day.php
  3. 分組安裝包,增加了分組方法你https://github.com/beberlei/DoctrineExtensions
+0

感謝您的幫助,我用nativeQuery,它工作得很好。 – user2576422

1

對於那些誰想要使用DQL一個例子,有一種方法可以做到這一點:

$query->select('count(p), p.transactionDate, SUBSTRING(p.transactionDate, 1, 10) as my_date') 
    //... 
    ->groupBy('my_date'); 

參見SUBSTRING

SUBSTRING(str,pos,len). The forms with a len argument return a substring len characters long from string str, starting at position pos.

在我的例子的文檔,我開始在位置1至10周的wh ich給我YYYY-MM-DD。舉例來說,如果你只是想在一天,你可以在第9位開始,在第二種情況下的2

SUBSTRING(p.transactionDate, 9, 2) 
+0

這樣做對sql服務器不起作用(得到未知列),可能是因爲[this](https://stackoverflow.com/a/3841804/4126114) – shadi

+0

做'groupBy(「substring(...)」 )'產生一個Doctrine語義錯誤 – shadi

+0

剛剛提交的doctrine2 [問題6629](https://github.com/doctrine/doctrine2/issues/6629) – shadi