1

我正在寻找按天对我的政策进行分组的方法。我尝试了很多示例如何执行此操作,但仍然存在一些错误。谁能帮我这个?在这里,我将只展示两个示例,我尝试的其他示例与这些示例相似。差异仅在于使用的 SQL 函数 ex(CAST, SUBSTRING, DATE...) 我尝试的第一种方法是:

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

错误是:

[语义错误] 第 0 行,第 156 列靠近 'DAY(p.transa':错误:无法按未定义的标识或结果变量分组。

第二种方法是:

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

错误是:

[语义错误] 第 0 行,第 72 列,靠近“FROM GLPolicyBundle:Policy”:错误:未定义“FROM”类。

4

2 回答 2

3

Doctrine 不支持许多本机数据库功能,因为它应该与许多不同类型的数据库一起使用。所以你有三个选择。

  1. 使用NativeQuery类(http://docs.doctrine-project.org/en/latest/reference/native-sql.html
  2. 实现自定义 SQL walker。这是按天分组的示例(https://github.com/beberlei/DoctrineExtensions/blob/master/lib/DoctrineExtensions/Query/Mysql/Day.php
  3. 安装一个为你添加分组方法的包https://github.com/beberlei/DoctrineExtensions
于 2013-07-17T19:50:10.600 回答
2

对于那些想要使用 DQL 的人,有一种方法可以做到:

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

请参阅SUBSTRING的文档

子串(str,pos,len)。带有 len 参数的表单从字符串 str 返回一个子字符串 len 个字符,从位置 pos 开始。

在我的示例中,我从位置 1 到 10 开始,这给了我 YYYY-MM-DD。例如,如果你只想要一天,你可以从位置 9 开始,长度为 2

SUBSTRING(p.transactionDate, 9, 2)
于 2016-02-24T08:14:56.793 回答