Группа по ошибке с postgres и pomm orm
Я хочу выполнить следующий запрос 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}"
в /home/vagrant/sourcefiles/vendor/pomm-project/model-manager/sources/lib/Model/F FlexibleEntity/F FlexibleContainer.php строка 64
{"исключение":" [объект] (InvalidArgumentException(код: 0): нет такого поля 'id'.
Существующие поля: {date, count}
по адресу /home/vagrant/sourcefiles/vendor/pomm-project/model-manager/sources/lib/Model/F FlexibleEntity/F FlexibleContainer.php:64)"} []
Таким образом, я попытался иметь идентификатор в моем выборе, я получаю эту ошибку:
request.CRITICAL: необработанное исключение PHP
PommProject\Foundation\Exception\SqlException: "
Состояние ошибки SQL '42803' [ОШИБКА] ==== ОШИБКА: столбец "e.id" должен появляться в предложении GROUP BY или использоваться в статистической функции LINE 1: SELECT e.id, e.date, COUNT(id_customers) ОТ события е ГДЕ... ^==== "ПОДГОТОВИТЬ === ВЫБРАТЬ e.id, e.date, COUNT (id_customers) ОТ события e WHERE event_id = $1 GROUP BY e.date ===". "At /home/vagrant/sourcefiles/vendor/pomm-project/foundation/sources/lib/Session/Connection.php строка 327 {"исключение":" [объект] (PommProject\Foundation\Exception\SqlException(код: 0): \nSQL состояние ошибки '42803' [ОШИБКА]\n====\nERROR: столбец \"e.id\" должен присутствовать в предложении GROUP BY или использоваться в статистической функции \nLINE 1: SELECT e.id, e.date, COUNT(id_customers) событие FROM e WHERE ...\n ^\n\n====\n "ПОДГОТОВИТЬ === \ n ВЫБРАТЬ e.id, e.date, COUNT (id_customers) ОТ события e WHERE event_id = $1 GROUP BY e.date\n === ". at /home/vagrant/sourcefiles/vendor/pomm-project/foundation/sources/lib/Session/Connection.php:327)"} []
Единственное, что работает, это когда у меня есть идентификатор в группе, но это не тот результат, которого я хочу.
Кто-то может объяснить мне, почему это работает в базе данных, а не в php?
3 ответа
Это потому, что вы выбираете гибкие объекты без их первичного ключа. За сценой находится средство идентификации, которое обеспечивает выборку дважды одного и того же объекта, возвращающего один и тот же экземпляр.
В этом случае вам не нужно выбирать объекты (следовательно, 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])
;
Это именно так GROUP BY
работает в PostgreSQL:
Когда присутствует GROUP BY, недопустимо, чтобы выражения списка SELECT ссылались на несгруппированные столбцы, кроме как внутри агрегатных функций, так как было бы более одного возможного значения, которое нужно вернуть для несгруппированного столбца.
Это означает, что каждое поле в вашем запросе должно присутствовать в GROUP BY
оператор или обрабатывается любой из функций агрегирования. Это одно из различий между GROUP BY
в MySQL и PostreSQL.
Другими словами, вы можете добавить id
в GROUP BY
Скажите и не беспокойтесь об этом;)
Я думаю это потому что псевдоним,
попробуй это
$sql = "SELECT e.date, COUNT(e.id_customers) FROM event e WHERE event_id = $* GROUP BY e.date";
return $this->query($sql, [$eventId])->extract();