![](/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.