簡體   English   中英

在Doctrine DQL查詢中使用COLLATE(Symfony2)

[英]Using COLLATE inside Doctrine DQL Query (Symfony2)

我找不到與使用Doctrine進行DQL查詢時使用COLLATE相關的任何內容(當然它似乎不起作用)。

我的具體問題:

我有一個utf8_general_ci字符集的表。 我有一個具有重音字符的特定字段(如'á','ű','ő'等)

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'

這僅返回非重音版本。

問題是,可以使用Doctrine的createQuery(編寫dql)或查詢構建器來完成這樣的事情嗎?

我想我已經閱讀了所有相關文檔,但找不到辦法做到這一點。 有可能嗎?

遵循Cerad建議編寫自定義DQL函數: http//www.doctrine-project.org/2010/03/29/doctrine2-custom-dql-udfs.html

我設法創建了這個:

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時( http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html )這將查找帶有兩個參數的Collat​​e'函數':字段和字符集(沒有有效的字符集)檢測呢)。

像(用DQL編寫)的作品

COLLATE( field , collation ) 

並創建(在可運行的MySQL中)

`field` COLLATE collation 

Ofcourse collat​​ion應該是一個有效的charset(例如utf8_bin )或者你會得到一個MySQL錯誤。

我想有一個更簡單的解決方案,但我只能將其創建為“功能”。 至少問題已經解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM