自 mysql 5.7.5 起,group by 发生了变化
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
如果我提出这个查询
$qb = $this->createQueryBuilder('d');
$qb->select('ANY_VALUE(d.id), d.nom, count(d.nom) as lignes');
$qb->groupBy('d.nom');
$qb->orderBy('d.nom');
我有一个错误
表达式 #1SELECT
列表不在GROUP BY
子句并包含非聚合列 'sepultures.d0_.id
' 在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容
正如 mysql 文档中所解释的,这个问题可以用 any_value 解决,如下所示
$qb = $this->createQueryBuilder('d');
$qb->select('ANY_VALUE(d.id), d.nom, count(d.nom) as lignes');
$qb->groupBy('d.nom');
$qb->orderBy('d.nom');
但学说不承认这个功能
[2/2] QueryException: [语法错误] 第 0 行,第 7 列:错误:预期
已知函数,得到“ANY_VALUE”
我该如何解决?
正如文森特所说,我必须创建一个函数:
<?PHP
//src/MyBundle/DoctrineExtensions/Utils/AnyValue.php
namespace DoctrineExtensions\Utils;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;
class AnyValue extends FunctionNode {
public $value; // la valeur passée en paramètre de la fction ANY_VALUE()
public function parse( Parser $parser ) {
$parser->match( Lexer::T_IDENTIFIER ); //identifie la fonction ANY_VALUE() de mysql
$parser->match( Lexer::T_OPEN_PARENTHESIS ); //parenthèse ouvrante
$this->value = $parser->StringPrimary();
$parser->match( Lexer::T_CLOSE_PARENTHESIS );////parenthèse fermante
}
public function getSql( SqlWalker $sqlWalker ) {
return 'ANY_VALUE(' . $this->value->dispatch( $sqlWalker ) . ')';
}
}
config.yml 文件中的学说扩展类声明(具有名为 ANY_VALUE 的键):
#app/config/config.yml
doctrine:
orm:
auto_generate_proxy_classes: %kernel.debug%
default_entity_manager: default
entity_managers:
default:
auto_mapping: true
connection: default
dql:
string_functions:
ANY_VALUE: DoctrineExtensions\Utils\AnyValue
请求:
//ANY_VALUE représente la clé contenue dans le fichier config.yml
$qb = $this->createQueryBuilder('d');
$qb->select('ANY_VALUE(d.id), d.nom, count(d.nom) as lignes');
$qb->groupBy('d.nom');
$qb->orderBy('d.nom')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)