Ошибка: ожидаемая известная функция, получила 'GROUP_CONCAT' - PullRequest
1 голос
/ 25 сентября 2019

В PhpMyAdmin я могу использовать следующий скрипт, и он работает как шарм:

SELECT personal.city, GROUP_CONCAT(technologies.tech)
FROM personal
INNER JOIN technologies ON technologies.uid = personal.uid
WHERE personal.uid = 88

Но у меня есть динамический метод, который выглядит следующим образом:

public function user($uid, $selection, $tables) {
    // 1. Query builder
    $queryBuilder = $this->createQueryBuilder('u')->select($selection)->where('u.uid = :uid')->addSelect('GROUP_CONCAT(t.tech)');

    // 2. Get each table
    foreach ($tables as $key => $value) {
        $queryBuilder = $queryBuilder->innerJoin('App\Entity\\' . $value, $key)->andWhere("$key.uid = :uid");
    }

    // 3. Finish and return the query
    return $queryBuilder
        ->setParameter('uid', $uid)
        ->getQuery()
        ->getResult()
    ;
}

Если я запускаюэто, я получу следующее сообщение об ошибке:

[Синтаксическая ошибка] строка 0, столбец 25: Ошибка: ожидаемая известная функция, получил 'GROUP_CONCAT'

Чтоточно я делаю не так с GROUP_CONCAT?

Ответы на этот вопрос мне не помогли, так как они касаются вопроса Symfony2, но я использую Symfony4.

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

GROUP_CONCAT не является функцией DQL.Вы не можете использовать функции MySQL в DQL.Вот список функций, которые Doctrine поддерживает в DQL: https://www.doctrine -project.org / projects / doctrine-orm / en / 2.6 / reference / dql-doctrine-query-language.html # dql-functions

Я настоятельно советую вам не использовать GROUP_CONCAT в вашем приложении.Вы можете получить данные в виде массива в отдельном запросе и объединить их в PHP.Не должно быть заметного снижения производительности.

Но если вам действительно нужно его использовать, вы должны написать свою собственную определяемую пользователем функцию DQL.Вот учебник для него: https://www.doctrine -project.org / projects / doctrine-orm / en / 2.6 / cookbook / dql-user -fined-functions.html

А вот икак зарегистрировать эту функцию DQL внутри Symfony: https://symfony.com/doc/current/doctrine/custom_dql_functions.html

0 голосов
/ 26 сентября 2019

Поскольку я не мог найти лучшее (или более простое решение), я просто передаю сырой SQL следующим методом:

public function rawSQL($sql) {
    $statement = $this->entityManager->getConnection()->prepare($sql);
    $statement->execute();
    $result = $statement->fetchAll();
    return $result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...