如何在Doctrine中使用PostgreSQL COLLATE修饰符

时间:2017-08-30 09:13:34

标签: php postgresql doctrine-orm doctrine-query doctrine-extensions

我在我的项目中使用Doctrine和PostgreSQL数据库,我想让它可以翻译。问题是我想对与所选语言习惯正确相关的一些字符串进行排序。

EG。在捷克语中,字母“CH”位于aplhabet中的字母“H”之后,因此我希望在排序列表中看到“Class”,“Horn”,“Chord”;但是在英语中我想要“Chord”,“Class”,“Horn”。

在Postgres中,我可以在翻译表中创建一个部分索引,然后使用类似:

SELECT *
FROM "entity_translation"
WHERE "lang" = 1
ORDER BY "name" collate "en_US"

但是我无法(〜我不知道该怎么做)在Doctrine / DBAL中使用这种语法。

您是否在我的用例中使用类似的东西或任何其他解决方案?

1 个答案:

答案 0 :(得分:0)

我通过为教条编写自己的自定义DQL函数来解决这个问题。如图所示Using COLLATE inside Doctrine DQL Query (Symfony2)

Doctrine Blog article提供有关如何注册新编写函数的详细信息。简短版本看起来像

 $config = Setup::createAnnotationMetadataConfiguration($folderConfig, $devMode);
 $config->addCustomStringFunction('collate', Collate::class);
 $this->_entityManager = EntityManager::create($dbParams, $config);

查询可能看起来像(未经测试的代码)

$query = $queryBuilder->select('t.*')
            ->from(Translation::class, 't') 
              [...]         
            ->orderBy('collate(t.translatedText, en_US)')

确保OS或Container安装了正确的区域设置。