在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。
答案 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