Запрос Symfony с ONLY_FULL_GROUP_BY ON

Я хочу получить коллекцию объектов в результате сгруппированных по имени городов, мой запрос

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, есть ли решение?

Ваш запрос не содержит агрегированных столбцов, он не разрешен в режиме only_full_group_by. Попробуйте переписать свой запрос, включив в него агрегаты

Flying 03.01.2019 15:24

спасибо, но запрос перезаписи не возвращает коллекцию объекта

Hansen mattias 03.01.2019 15:47

Запрос с агрегацией вообще не означает возврата полных строк таблицы, он касается SQL, а не Doctrine. Попробуйте подумать о своей цели, чего вы на самом деле хотите достичь с помощью этого пункта groupBy?

Flying 03.01.2019 15:53

Мне нужна коллекция, чтобы использовать ее в поле формы query_builder

Hansen mattias 03.01.2019 16:01

Имя вашего метода - getDistinctCitiesName, поэтому я могу предположить, что ваш фактический запрос должен выглядеть как select distinct(name) from cities, но ваш фактический запрос отличается.

Flying 03.01.2019 16:07

Спасибо, но, как сказано, я хочу получить коллекцию объектов, выбрать отдельный, вернуть только массив значений

Hansen mattias 03.01.2019 17:20

В этом случае вам нужно либо получить коллекцию объектов и извлечь из них отдельные имена вручную, либо написать запрос, который загрузит разные имена (но не объекты!) Из базы данных.

Flying 03.01.2019 17:33

Спасибо @Flying, так что у меня нет выбора, это досадное ограничение.

Hansen mattias 03.01.2019 17:59

На самом деле это не ограничение, а способ работы реляционных баз данных. Я бы порекомендовал вам обновить свой запрос, чтобы использовать select distinct и получать один столбец значений, чтобы избежать загрузки ненужных данных в приложение.

Flying 03.01.2019 18:03

@hous full-group-by - это правильный способ создать SQL-запрос, отключить его не существует в других СУБД, кроме mysql, насколько я знаю ...

Hansen mattias 04.01.2019 10:43
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
11
3 197
1

Ответы 1

Вам необходимо отключить 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 в конфигурацию доктрины работает нормально! Спасибо. Мои вопросы: «Почему этот вариант? Не вызовет ли это изменение каких-либо других проблем?»

D.Picard 25.05.2021 12:06

Другие вопросы по теме