2016-12-27 49 views
1

的錯誤,我想執行下面的SQL查詢:組用的Postgres和POMM ORM

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: Uncaught PHP Exception InvalidArgumentException:
"No such field 'id'. Existing fields are {date, count}"
at /home/vagrant/sourcefiles/vendor/pomm-project/model-manager/sources/lib/Model/FlexibleEntity/FlexibleContainer.php line 64
{"exception":" [object] (InvalidArgumentException(code: 0): No such field 'id'.
Existing fields are {date, count}
at /home/vagrant/sourcefiles/vendor/pomm-project/model-manager/sources/lib/Model/FlexibleEntity/FlexibleContainer.php:64)"} []

於是,我就在我的選擇ID,通過我得到這個錯誤:

request.CRITICAL: Uncaught PHP Exception
PommProject\Foundation\Exception\SqlException: "
SQL error state '42803' [ERROR] ==== ERROR: column "e.id" must appear in the GROUP BY clause or be used in an aggregate function 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 line 327 {"exception":"[object] (PommProject\Foundation\Exception\SqlException(code: 0): \nSQL error state '42803' [ERROR]\n====\nERROR: column \"e.id\" must appear in the GROUP BY clause or be used in an aggregate function\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?

回答

1

這是因爲你取靈活的實體沒有他們的主鍵。在場景後面有一個身份映射器,確保兩次獲取相同的實體將返回相同的實例。

在這種情況下,您不需要獲取實體(因此在查詢後查找extract)。所以,你可以只使用QueryManager波爾返回轉換陣列類似如下:

$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]) 
; 
+0

非常感謝!完美地工作 –

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(); 
+0

不改變,我仍然有同樣的錯誤 –

0

這究竟是如何GROUP BY作品的PostgreSQL:

When GROUP BY is present, it is not valid for the SELECT list expressions to refer to ungrouped columns except within aggregate functions, since there would be more than one possible value to return for an ungrouped column.

這意味着,在您的查詢要麼必須在每個領域出現在GROUP BY聲明中或由任何聚合函數處理。這是MySQL和PostreSQL中的GROUP BY之間的區別之一。

換句話說,你可以在GROUP BY語句添加id而不用擔心它;)

+0

謝謝您的回答。但我不明白爲什麼它在數據庫中工作。 此外,我不能在組中添加id,因爲它改變了我想要的結果。 而我不明白爲什麼我必須把id,而我甚至不用它在選擇。這是從哪裏來的? –

+0

嗯不知道,我想你需要深入挖掘並調試FlexibleContainer :: fields方法 –