Я хочу получить коллекцию объектов в результате сгруппированных по имени городов, мой запрос
public function getDistinctCitiesName()
{
$qb = $this->createQueryBuilder("cc");
->add('groupBy', 'cc.name');
return $qb;
}
При запуске у меня исключение
request.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\Exception\DriverException: "An exception occurred while executing 'SELECT c0_.id AS id_0, c0_.name AS name_1, c0_.postal_code AS postal_code_2, c0_.country AS country_3, c0_.state AS state_4, c0_.visible AS visible_5 FROM cities c0_ GROUP BY c0_.name': SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'www.c0_.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by"
Я не могу отключить режим only_full_group_by, есть ли решение?
спасибо, но запрос перезаписи не возвращает коллекцию объекта
Запрос с агрегацией вообще не означает возврата полных строк таблицы, он касается SQL, а не Doctrine. Попробуйте подумать о своей цели, чего вы на самом деле хотите достичь с помощью этого пункта groupBy?
Мне нужна коллекция, чтобы использовать ее в поле формы query_builder
Имя вашего метода - getDistinctCitiesName, поэтому я могу предположить, что ваш фактический запрос должен выглядеть как select distinct(name) from cities, но ваш фактический запрос отличается.
Спасибо, но, как сказано, я хочу получить коллекцию объектов, выбрать отдельный, вернуть только массив значений
В этом случае вам нужно либо получить коллекцию объектов и извлечь из них отдельные имена вручную, либо написать запрос, который загрузит разные имена (но не объекты!) Из базы данных.
Спасибо @Flying, так что у меня нет выбора, это досадное ограничение.
На самом деле это не ограничение, а способ работы реляционных баз данных. Я бы порекомендовал вам обновить свой запрос, чтобы использовать select distinct и получать один столбец значений, чтобы избежать загрузки ненужных данных в приложение.
@hous full-group-by - это правильный способ создать SQL-запрос, отключить его не существует в других СУБД, кроме mysql, насколько я знаю ...






Вам необходимо отключить ONLY_FULL_GROUP_BY в mySQL, чтобы избавиться от этого исключения. Для вас есть два варианта: -
1: - Отключить его в конфигурации доктрины
options:
1002: 'SET sql_mode=(SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""))'
Если вы добавите это в конфигурацию доктрины, вы больше не получите исключения.
2: - Отключить в mySQL Либо выполните следующую команду в консоли mysql
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Или удалите его из phpmyadmin отключить ONLY_FULL_GROUP_BY из phpmyadmin
Это мой блог по этой теме. Вы можете проверить это и поделиться своим обзором.
Спасибо!
Добавление опции 1002 в конфигурацию доктрины работает нормально! Спасибо. Мои вопросы: «Почему этот вариант? Не вызовет ли это изменение каких-либо других проблем?»
Ваш запрос не содержит агрегированных столбцов, он не разрешен в режиме only_full_group_by. Попробуйте переписать свой запрос, включив в него агрегаты