2016-12-30 3 views
2

Seit MySQL 5.7.5 Gruppe haben WechselLehre, wie ANY_VALUE mysql-Funktion verwenden

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Wenn ich diese Abfrage

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

ich einen Fehler haben

Expression # 1 von SELECT Liste ist nicht in GROUP BY Klausel und enthält nicht aggregierte Spalte 'sepultures.d0_.id', die nicht funktional abhängig ist nt auf Spalten in GROUP BY-Klausel; dies ist unvereinbar mit sql_mode = only_full_group_by

Wie in mysql doc erklären, kann dieses Problem mit any_value wie diese

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

Aber Lehre erkennen diese Funktion nicht lösen

[2/2] QueryException: [Syntax Error] line 0, col 7: Error: Expected known function, got 'ANY_VALUE'

Wie kann ich es lösen?

+2

min- oder max-funktion verwenden? d.h. 'min (d.id)'. Die Abfrage wird nun in allen Dialekten von SQL gültig sein. –

+0

Es könnte interessant sein zu versuchen, die sucl 'ANY_VALUE' Funktion zu doctrine2 hinzuzufügen? Vielleicht interessant? [Für die PHP-Crowd: Hinzufügen von benutzerdefinierten Funktionen zu Doctrine 2 DQL] (http://punkave.com/window/2012/07/24/for-the-php-crowd-adding-custom-functions-to-doctrine-2 -dql). Außerdem: [DQL User Defined Functions] (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/dql-user-defined-functions.html). –

Antwort

1

Wenn Lehre nicht any_value() Funktion nicht erkennt, dann könnte man die Abfrage als eine rohe SQL-Anweisung ausführen:

$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 
... 

Ich würde nicht eine vorbereitete Anweisung verwenden, wenn Sie keine Parameter haben (im Beispielcode Sie tun nicht).

+0

funktioniert es auch nicht, es ist der gleiche Fehler: Lehre erkennt nicht :-( – Jsenechal

2

als vincent sagte ich eine Funktion erstellen muß:

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

Erklärung der Lehre Erweiterungsklasse (mit einem Schlüssel mit dem Namen ANY_VALUE) in der config.yml Datei:

#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 

die Anfrage:

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