对于那些无法改变自己的数据库排序规则,你可以使用BINARY
运营商为了强制标准的大小写敏感性。
BINARY运算符将后面的字符串转换为二进制字符串。 这是一种简单的方法,可以逐字节地完成比较,而不是逐个字符地完成。 BINARY还会导致尾部空格 变得非常重要。
有关更多详细信息,请参阅MySQL BINARY Operator。
要在Doctrine DQL中启用BINARY
运算符,您可以安装Doctrine Extensions library。 或者像这样创建自己的二进制字符串函数。
use Doctrine\ORM\Query\AST\Functions\FunctionNode,
Doctrine\ORM\Query\Lexer;
class Binary extends FunctionNode
{
private $stringPrimary;
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringPrimary = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return 'BINARY('.$sqlWalker->walkSimpleArithmeticExpression($this->stringPrimary).')';
}
}
接下来,您需要在您的原则配置中注册binary
字符串函数。您可以在您的配置设置中进行此操作,或按照需要添加它。
$em->getConfiguration()->addCustomStringFunction('binary', 'DoctrineExtensions\\Query\\Mysql\\Binary');
然后,你将能够使用binary(...)
功能在您的DQL像这样。
$q = $em->createQuery('select u from UserEn u where binary(u.name) = :name');
echo $q->getSQL();
/* SELECT ... FROM ... WHERE BINARY(u0_.name) = ? */
添加使用Symfony框架中,binary
字符串函数在config.yml
文件改变doctrine.orm.entity_managers.%entity_manager%.dql
设置像这样。
doctrine:
orm:
#...
entity_managers:
#...
default:
#...
dql:
#...
string_functions:
#...
binary: 'DoctrineExtensions\Query\Mysql\Binary'
见Symfony Doctrine Configuration Documentation更多细节
最佳答案的话题:) –