對於那些無法改變自己的數據庫排序規則,你可以使用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更多細節
最佳答案的話題:) –