我正在尝试通过doctrine的查询生成器在MySQL上使用自然排序。但是 orderBy() 函数没有我需要的参数。
这是我需要传递给原则的查询:
SELECT * FROM `ouvidoria`
ORDER BY CAST(RIGHT(`id`, LENGTH(`id`)-3) AS UNSIGNED) DESC;
我尝试过以下方法:
public function getLastKeyOfOrigin($origin) {
$data = $this->getRepository()->findOneBy(['origin'=>$origin->getId()]);
$select = $this->em->createQueryBuilder();
$select->select('o')
->from($this->entityPath, 'o')
->where("o.origin = :origin")
->setParameter('origin', $origin)
->orderBy('CAST(RIGHT(o.id, LENGTH(o.id)-3) AS UNSIGNED)', 'DESC')
->setMaxResults('1');
return $select->getQuery()->getOneOrNullResult();
}
这给出了以下错误:
类型:Doctrine\ORM\Query\QueryException 消息:[语法错误]第 0 行,第 79 列:错误:预期已知函数,得到“CAST”
你可以这样做:
$select->select('o')
->from($this->entityPath, 'o')
->where("o.origin = :origin")
->setParameter('origin', $origin)
->addSelect('CAST(RIGHT(o.id, LENGTH(o.id)-3) AS UNSIGNED) AS HIDDEN orderCol')
->orderBy('orderCol', 'DESC')
->setMaxResults('1');
因此,您可以通过使用其他地方定义的别名来保持
orderBy()
的简单性,这可以帮助您克服其局限性。
我通过按 2 列对查询进行排序来解决了这个问题,但是回答所提出的问题时,您可以使用原则的 NativeQuery 类通过原则发送裸 SQL。
Doctrine核心实现了所有供应商都支持的SQL部分。您可以使用扩展来访问特定于语言的函数,例如 MySql 的 CAST 函数。
例如,著名的beberlei扩展有数十个MySql扩展,包括CAST。