首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用排序规则内部的DQL查询(Symfony2)

使用排序规则内部的DQL查询(Symfony2)
EN

Stack Overflow用户
提问于 2014-03-11 12:33:54
回答 1查看 4.3K关注 0票数 6

在带有Doctrine的DQL查询中,我找不到与使用排序规则有关的任何内容(当然,它似乎不起作用)。

我的具体问题是:

我有一张带有utf8_general_ci字符集的桌子。我有一个特定的字段,其中有重音字符(比如'á',‘ű’,‘ő’等等)。

utf8_general_ci的基本比较无法确定普通字符和它们的重音对(a =á,u=ű,o=ő)之间的差异,对于我来说,这对于表上的大多数查询来说都是非常好的!所以如果我说:

代码语言:javascript
复制
 col1 |  col2
------|-------
   1  | árvíz  
------|-------
   2  | arviz

此查询将返回两个结果:

代码语言:javascript
复制
SELECT * FROM `table` WHERE `col2` = 'arviz'

同样,对于大多数用例来说,这是非常好的!

但是有一个特殊的有趣之处,我需要确定差异,在常规的MySQL中我可以使用:

代码语言:javascript
复制
SELECT * FROM `table` WHERE `col2` COLLATE utf8_bin = 'arviz'

这只返回未重音的版本。

问题是,这样的事情是否可以使用Doctrine的createQuery (编写dql)或查询生成器来完成?

我想我已经阅读了所有相关的文档,但找不到一个方法来做到这一点。是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-11 15:15:32

按照Cerad编写自定义DQL函数的建议:http://www.doctrine-project.org/2010/03/29/doctrine2-custom-dql-udfs.html

我设法创建了以下内容:

代码语言:javascript
复制
namespace MyCompany\MyBundle\DQL;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;

class CollateFunction extends FunctionNode
{
    public $expressionToCollate = null;
    public $collation = null;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->expressionToCollate = $parser->StringPrimary();

        $parser->match(Lexer::T_COMMA);

        $parser->match(Lexer::T_IDENTIFIER);
        $lexer = $parser->getLexer();
        $this->collation = $lexer->token['value'];

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return sprintf( '%s COLLATE %s', $this->expressionToCollate->dispatch($sqlWalker), $this->collation );
    }
}

注册到config.yml (functions.html)后,将查找带有两个参数的排序规则“函数”:一个字段和一个字符集(还没有有效的字符集检测)。

作品(用DQL写)

代码语言:javascript
复制
COLLATE( field , collation ) 

并创建(在可运行MySQL中)

代码语言:javascript
复制
`field` COLLATE collation 

当然,排序规则应该是一个有效的字符集(如utf8_bin),否则您将得到一个MySQL错误。

我想有一个更简单的解决方案,但我只能将其创建为一个“函数”。至少问题已经解决了。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22325898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档