データベースの照合を変更できない場合は、BINARY
演算子を使用して、大文字と小文字の区別を基準に強制できます。
BINARY演算子は、それに続く文字列を2項文字列にキャストします。これは、文字ごとではなくバイトごとに比較を強制する簡単な方法です。BINARYを使用すると、末尾のスペースも重要になります。
詳細については、 MySQLの二項演算子を参照してください。
BINARY
Doctrine DQLでオペレーターを有効にするには、 DoctrineExtensionsライブラリをインストールします。または、そのように独自のバイナリ文字列関数を作成します。
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
次に、文字列関数をDoctrine構成に登録する必要があります。構成設定でこれを行うか、必要に応じて追加することができます。
$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) = ? */
binary
Symfony Frameworkを使用して文字列関数を追加するには、ファイルで次のように設定をconfig.yml
変更します。doctrine.orm.entity_managers.%entity_manager%.dql
doctrine:
orm:
#...
entity_managers:
#...
default:
#...
dql:
#...
string_functions:
#...
binary: 'DoctrineExtensions\Query\Mysql\Binary'
詳細については、 SymfonyDoctrine構成ドキュメントを参照してください。