postgres和pomm orm

时间:2016-12-27 13:18:02

标签: postgresql symfony pomm

我想执行以下SQL查询:

SELECT date, COUNT(id_customers) 
FROM event 
WHERE event_id = 3  
GROUP BY date

当我在我的数据库中尝试此查询时,它完美地运行。但在我的代码中,我收到一个我无法解决的错误。

我使用symfony2和orm pomm。这是Postgresql。

这是我的代码:

$sql = "SELECT e.date, COUNT(id_customers) FROM event e WHERE event_id = $* GROUP BY e.date";

return $this->query($sql, [$eventId])->extract();

这是错误:

  

request.CRITICAL:未捕获的PHP异常InvalidArgumentException:
  “没有这样的字段'id'。现有字段是{date,count}”   at /home/vagrant/sourcefiles/vendor/pomm-project/model-manager/sources/lib/Model/FlexibleEntity/FlexibleContainer.php第64行   {“exception”:“[object](InvalidArgumentException(code:0):没有这样的字段'id'。
  现有字段为{date,count}
  at /home/vagrant/sourcefiles/vendor/pomm-project/model-manager/sources/lib/Model/FlexibleEntity/FlexibleContainer.php:64)“} []

所以我尝试在我的选择中输入id,我得到了这个错误:

  

request.CRITICAL:未捕获的PHP异常
  PommProject \ Foundation \ Exception \ SqlException:“
  SQL错误状态'42803'[错误] ====错误:列“e.id”必须出现在GROUP BY子句中或用于聚合函数LINE 1:SELECT e.id,e.date,COUNT(id_customers) )FROM event e WHERE ... ^

     

====«PREPARE === SELECT e.id,e.date,COUNT(id_customers)FROM event e WHERE event_id = $ 1 GROUP BY e.date ===»。“at / home / vagrant / sourcefiles /vendor/pomm-project/foundation/sources/lib/Session/Connection.php第327行{“exception”:“[object](PommProject \ Foundation \ Exception \ SqlException(code:0):\ n SQL错误状态'42803' [错误] \ n ==== \ nERROR:列\“e.id \”必须出现在GROUP BY子句中或用于聚合函数\ nLINE 1:SELECT e.id,e.date,COUNT(id_customers )FROM event e WHERE ... \ n ^ \ n \ n ==== \ n«PREPARE === \ nSELECT e.id,e.date,COUNT(id_customers)FROM event e WHERE event_id = $ 1 GROUP BY e .date \ n ===»。at /home/vagrant/sourcefiles/vendor/pomm-project/foundation/sources/lib/Session/Connection.php:327)"} []

唯一可行的是当我在群组中拥有id时,但这不是我想要的结果。

有人可以解释一下为什么这个在数据库中工作而不是在php中?

3 个答案:

答案 0 :(得分:1)

这是因为您在没有主键的情况下获取灵活实体。在场景后面有一个身份映射器,确保两次获取相同的实体将返回相同的实例。

在这种情况下,您不需要获取实体(因此查询后的extract)。因此,您可以使用QueryManager pooler返回转换后的数组,如下所示:

$sql = "SELECT e.date, COUNT(id_customers) FROM event e WHERE event_id = $* GROUP BY e.date";

// Return an iterator that fetches converted arrays on demand:
return $this
    ->getSession()
    ->getQueryManager()
    ->query($sql, [$eventId])
;

答案 1 :(得分:0)

我认为它是因为别名,

试试这个

$sql = "SELECT e.date, COUNT(e.id_customers) FROM event e WHERE event_id = $* GROUP BY e.date";

return $this->query($sql, [$eventId])->extract(); 

答案 2 :(得分:0)

这正是GROUP BY在PostgreSQL中的作用:

  

当GROUP BY存在时,它对SELECT列表无效   用于引用未聚合列的表达式,但在聚合中除外   函数,因为将返回多个可能的值   对于未分组的列。

这意味着查询中的每个字段必须存在于GROUP BY语句中或由任何聚合函数处理。这是MySQL和PostreSQL中GROUP BY之间的差异之一。

换句话说,您可以在id语句中添加GROUP BY而不用担心;)