2016-12-30 1 views
2

Поскольку MySQL 5.7.5 группа по изменению естьДоктрина, как использовать функцию ANY_VALUE MySQL

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

У меня есть ошибка

Expression # 1 из SELECT список отсутствует в пункте GROUP BY и содержит неагрегированный столбец «sepultures.d0_.id», который не зависит от функциональности nt в столбцах в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by

Как поясняют в тузд документ, эта проблема может решить с 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'

Как я могу разрешить его?

+2

использование мин или max функция? т. е. 'min (d.id)'. Теперь запрос будет действителен во всех диалектах SQL. –

+0

Может быть интересно попробовать добавить функцию sql 'ANY_VALUE' в doctrine2? Может быть, интересно? [Для толпы PHP: добавление пользовательских функций в Doctrine 2 DQL] (http://punkave.com/window/2012/07/24/for-the-php-crowd-adding-custom-functions-to-doctrine-2 -dql). Также: [Пользовательские функции DQL] (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/dql-user-defined-functions.html). –

ответ

1

Если учение не признает any_value() функцию, то вы могли бы выполнить запрос в качестве исходного оператора SQL:

$sql="select ANY_VALUE(d.id), d.nom, count(d.nom) as lignes from yourtable d group by d.nom" 
$em->getConnection()->query($sql); //$em is the entity manager 
... 

Я не хотел бы использовать подготовленное заявление, если у вас нет каких-либо параметров (в примере кода вы делаете не).

+0

он тоже не работает, это та же ошибка: доктрина не распознает :-( – Jsenechal

2

как сказал Венсан, я должен создать функцию:

<?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) . ')'; 
    } 
} 

декларацию класса расширения доктрины (с ключом именем ANY_VALUE) в файле config.yml:

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