正如文森特所说,我必须创建一个函数:
//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')