Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
条令如何使用任意_值mysql函数_Mysql_Symfony_Doctrine Orm - Fatal编程技术网

条令如何使用任意_值mysql函数

条令如何使用任意_值mysql函数,mysql,symfony,doctrine-orm,Mysql,Symfony,Doctrine Orm,自mysql 5.7.5以来,group by有了变化 如果我提出这个问题 $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'); 我有个错误 选择列表的表达式#1不在GROUP BY子句中,并且包含未聚合的列“secultur

自mysql 5.7.5以来,group by有了变化

如果我提出这个问题

$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');
我有个错误

选择
列表的表达式#1不在
GROUP BY
子句中,并且包含未聚合的列“
secultures.d0_uu.id
”,该列在功能上不依赖于GROUP BY子句中的列;这与sql\u mode=only\u full\u group\u by不兼容

正如mysql文档中所解释的,这个问题可以用任何像这样的_值来解决

$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列:错误:应为 已知函数,获得“任意值”


如何解决此问题?

如果条令无法识别
任何值()
函数,则可以将查询作为原始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
...

除非您有任何参数(在示例代码中您没有),否则我不会使用预先准备好的语句。

正如vincent所说,我必须创建一个函数:

<?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 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')
非常简单的方法:

1-安装此php库:

composer require beberlei/doctrineextensions
2-在doctor.yaml中添加此额外配置:

doctrine:
    ...
    orm:
        ...
        dql:
            string_functions:
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR: DoctrineExtensions\Query\Mysql\Year
                DAY: DoctrineExtensions\Query\Mysql\Day
                ....................................
有关更多详细信息,请参见以下官方文件:

使用最小或最大功能?i、 e.
min(d.id)
。查询现在在所有SQL方言中都有效。尝试将SQL“ANY_VALUE”函数添加到doctrine2可能会很有趣?也许有趣。另外:。它也不起作用,这是相同的错误:条令不承认:-(
doctrine:
    ...
    orm:
        ...
        dql:
            string_functions:
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR: DoctrineExtensions\Query\Mysql\Year
                DAY: DoctrineExtensions\Query\Mysql\Day
                ....................................