Php 错误:预期为已知函数,获得“组\u CONCAT”

Php 错误:预期为已知函数,获得“组\u CONCAT”,php,sql,symfony,symfony4,Php,Sql,Symfony,Symfony4,在PhpMyAdmin中,我可以使用以下脚本,它的工作方式与charm类似: 选择personal.city,GROUP\u concatechnologies.tech 私人的 technologies.uid=personal.uid上的内部连接技术 其中personal.uid=88 但我有一个动态方法,它看起来像这样: 公共函数用户$uid、$selection、$tables{ //1.查询生成器 $queryBuilder=$this->createQueryBuilder'u'->

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

选择personal.city,GROUP\u concatechnologies.tech 私人的 technologies.uid=personal.uid上的内部连接技术 其中personal.uid=88 但我有一个动态方法,它看起来像这样:

公共函数用户$uid、$selection、$tables{ //1.查询生成器 $queryBuilder=$this->createQueryBuilder'u'->选择$selection->where'u.uid=:uid'->添加选择'GROUP_CONCATt.tech'; //2.拿到每张桌子 foreach$表为$key=>$value{ $queryBuilder=$queryBuilder->innerJoin'App\Entity\\\'.$value,$key->and其中$key.uid=:uid; } //3.完成并返回查询 返回$queryBuilder ->设置参数'uid',$uid ->获取查询 ->获得结果 ; } 如果我运行它,我将得到以下错误消息:

[语法错误]第0行第25列:错误:预期为已知函数,已获取 “组_CONCAT”

我到底做错了什么


的答案对我没有帮助,因为他们的问题指的是Symfony2,但我使用的是Symfony4。

GROUP\u CONCAT不是DQL函数。您不能在DQL中使用MySQL函数。 以下是Doctrine在DQL中支持的函数列表:

我强烈建议您不要在应用程序中使用GROUP_CONCAT。您可以在单独的查询中以数组的形式获取数据,并在PHP中将其连接起来。应该没有明显的性能开销

但是如果您真的必须使用它,那么您必须编写自己的用户定义的DQL函数。 以下是它的教程:

下面是如何在Symfony中注册DQL函数:

因为我找不到更好或更简单的解决方案,所以我只是用以下方法传递原始SQL:

公共函数rawSQL$sql{ $statement=$this->entityManager->getConnection->prepare$sql; $statement->execute; $result=$statement->fetchAll; 返回$result; }
经过大量研究,我安装了包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函数,如度、ACOS、SIN、弧度和COS,我们是在谈论symfony4吗?在以前的版本中,您需要添加一条原则。请参阅:@freeek的可能重复项问题被标记为symfony4,因此我认为这就是这里使用的版本。@freeek是的,我使用的是symfony4。@PatrickQ你是对的,只是想确保标记在这里不会引起更多注意。