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

时间:2019-06-24 20:06:56

标签: php mysql doctrine-orm

我正在尝试通过教义的查询生成器在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();
}

wich出现以下错误:

  

类型:教义\ ORM \ Query \ QueryException   消息:[语法错误]行0,列79:错误:预期的已知功能,获取了“ CAST”

2 个答案:

答案 0 :(得分: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(),这有助于您克服其局限性。

答案 1 :(得分:0)

我通过按两列对查询进行排序来解决了这个问题,但是回答了这个问题,您可以使用教义的NativeQuery类通过教义发送裸SQL。