如何在 Doctrine 查询构建器的“orderBy()”上使用更高级的参数?

问题描述 投票:0回答:3

我正在尝试通过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”

php mysql doctrine-orm
3个回答
0
投票

你可以这样做:

$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()
的简单性,这可以帮助您克服其局限性。


0
投票

我通过按 2 列对查询进行排序来解决了这个问题,但是回答所提出的问题时,您可以使用原则的 NativeQuery 类通过原则发送裸 SQL。


0
投票

Doctrine核心实现了所有供应商都支持的SQL部分。您可以使用扩展来访问特定于语言的函数,例如 MySql 的 CAST 函数。

例如,著名的beberlei扩展有数十个MySql扩展,包括CAST。

© www.soinside.com 2019 - 2024. All rights reserved.