错误:预期的已知功能,获取了“ GROUP_CONCAT”

时间:2019-09-25 17:16:02

标签: php sql symfony symfony4

在PhpMyAdmin中,我可以使用以下脚本,它的工作方式类似于charm:

import

但是我有一个动态方法,看起来像这样:

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

如果我运行它,将会收到以下错误消息:

  

[语法错误]行0,列25:错误:预期的已知功能,得到了   'GROUP_CONCAT'

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() ; } 我到底在做什么错?

that question的答案并没有帮助我,因为他们的疑问是针对Symfony2,但是我正在使用Symfony4。

3 个答案:

答案 0 :(得分:1)

GROUP_CONCAT不是DQL函数。您不能在DQL中使用MySQL函数。 这是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-defined-functions.html

这是在Symfony中注册该DQL函数的方式: https://symfony.com/doc/current/doctrine/custom_dql_functions.html

答案 1 :(得分:0)

由于找不到更好(或更简单的解决方案),我只是通过以下方法传递原始SQL:

public function rawSQL($sql) {
    $statement = $this->entityManager->getConnection()->prepare($sql);
    $statement->execute();
    $result = $statement->fetchAll();
    return $result;
}

答案 2 :(得分:0)

经过大量研究后,我遇到了这个问题,我安装了包“beberlei/doctrineextensions”,然后进入我的学说配置文件,即 Doctrine.yaml,在我的情况下,我添加了以下代码,我可以使用 Mysql GroupConcat上面的包

orm:
    auto_generate_proxy_classes: true
    naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
    auto_mapping: true
    dql:
        string_functions:
            GROUP_CONCAT: DoctrineExtensions\Query\Mysql\GroupConcat

注意:我还可以通过“beberlei/doctrineextensions”使用其他数字 MySQL 函数,如 DEGREES、ACOS、SIN、RADIANS 和 COS