gpt4 book ai didi

mysql - Doctrine 如何使用 ANY_VALUE mysql 函数

转载 作者:行者123 更新时间:2023-11-29 01:26:47 26 4
gpt4 key购买 nike

自从mysql 5.7.5 group by发生了变化

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');

我有一个错误

SELECT 列表的表达式 #1 不在 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: [Syntax Error] line 0, col 7: Error: Expected known function, got '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')

关于mysql - Doctrine 如何使用 ANY_VALUE mysql 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41394814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com