Как использовать более продвинутые параметры для метода запросов Doctrine 'orderBy ()'? - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь использовать естественную сортировку в 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 '

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Я решил это, упорядочив запрос по 2 столбцам, но, отвечая на заданный вопрос, вы можете использовать класс NativeQuery в доктрине для отправки голого SQL через доктрину.

0 голосов
/ 24 июня 2019

Вы можете сделать это:

$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(), используя псевдоним, определенный в другом месте, и это помогает вам преодолеть его ограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...