使用在学说DQL查询(SYMFONY2)中进行整理



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

我的特定问题:

我有一个带有utf8_general_ci Charset的表。我有一个特定的字段,它具有重音字符(例如'á,'ű','ő'等)

utf8_general_ci的基本比较无法确定常规炭和它们的重音对之间的差异(a =á,u =ű,o =ő),这对我来说对我来说是完全很好的在那张桌子上!因此,如果我说:

 col1 |  col2
------|-------
   1  | árvíz  
------|-------
   2  | arviz

此查询将返回两个结果:

SELECT * FROM `table` WHERE `col2` = 'arviz'

再次,对于我大多数用例,这对我来说都是完全可以的!

但是有一个特定的拟合性,我需要确定差异,在常规的mysql中,我可以使用:

SELECT * FROM `table` WHERE `col2` COLLATE utf8_bin = 'arviz'

这仅返回未重新的版本。

问题是,可以使用教义的创建功能(写DQL)还是查询构建器来完成类似的事情?

我认为我已经阅读了所有相关文档,但找不到方法。有可能某种程度上吗?

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

我设法创建了这个:

namespace MyCompanyMyBundleDQL;
use DoctrineORMQueryASTFunctionsFunctionNode;
use DoctrineORMQueryLexer;
class CollateFunction extends FunctionNode
{
    public $expressionToCollate = null;
    public $collation = null;
    public function parse(DoctrineORMQueryParser $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(DoctrineORMQuerySqlWalker $sqlWalker)
    {
        return sprintf( '%s COLLATE %s', $this->expressionToCollate->dispatch($sqlWalker), $this->collation );
    }
}

注册到config.yml(http://symfony.com/doc/current/curent/cookbook/doctrine/custom_dql_functions.html)这将寻找一个与两个参数的"函数":一个字段和一个charset(尚无有效的Charset检测)。

工作类似于(用DQL编写)

COLLATE( field , collation ) 

和创建(在可运行的mysql中)

`field` COLLATE collation 

Collation应该是有效的Charset(例如utf8_bin),否则您将获得MySQL错误。

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

最新更新