![](/img/trans.png)
[英]createQueryBuilder leftJoin using Doctrine DQL and 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 )這將查找帶有兩個參數的Collate'函數':字段和字符集(沒有有效的字符集)檢測呢)。
像(用DQL編寫)的作品
COLLATE( field , collation )
並創建(在可運行的MySQL中)
`field` COLLATE collation
Ofcourse collation應該是一個有效的charset(例如utf8_bin
)或者你會得到一個MySQL錯誤。
我想有一個更簡單的解決方案,但我只能將其創建為“功能”。 至少問題已經解決了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.