Symfony3/Doctrine: ORDER BY CASE / Сначала определенное значение
Я ищу решение, чтобы заказать мой запрос с помощью построителя запросов.
Я хочу заказать мой запрос по ASC
но с определенным значением на первом месте. Я знаю как это сделать в SQL with order by case
... но я нашел несколько решений, которые на самом деле не работают с доктриной.
Например: у меня есть таблица с: A, B, D, C, F, E.
Я хочу отсортировать так: F, A, B, C, D, E
Я нашел что-то подобное в другой теме, но у меня это не работает:
$qb->addSelect("(CASE When c.type like 'foo%' Then 1 WHEN c.type like 'foo1%' THEN 1 ELSE 0 END) AS HIDDEN type");
Можно ли сделать что-то подобное прямо в orderBy
QueryBuilder (Доктрина)?
Спасибо за ваш ответ
--- РЕДАКТИРОВАТЬ ---
Я обнаружил проблему, она появилась из опции 'group_by' в моей форме. Итак, вот моя функция в моем хранилище:
public function findBolQB($username)
{
return $this
->createQueryBuilder('p')
->innerJoin('p.program','prg')
->innerJoin('prg.bol','b')
->innerJoin('prg.user','user')
->innerJoin('p.part','part')
->addSelect("(CASE When user.username like :name Then 0 ELSE 1 END) AS HIDDEN userChancla")
->setParameter(':name', $username)
->orderBy('userChancla')
->addOrderBy('b.code','ASC')
->addOrderBy('part.name','ASC');
}
Не забывайте orderBy('userChancla'), иначе он не будет работать!
Список используется в форме и группируется пользователем, поэтому в моем конструкторе форм мой код:
->add('bolEnBois', EntityType::class, array(
'class' => 'IssouChanclaBundle:Bol',
'placeholder' =>'--- Bol---',
'required' => false,
'attr'=>array('class'=>'select2'),
'query_builder' => function(BolRepository $a)use($options)
{
return $a->findBolQB($options['user']);
},
'group_by' => function(Bol $bol)
{
return $bol->getUser()->getFirstName().' '.$article->getUser()->getLastName();
},
))
Надеюсь, это поможет некоторым из вас:)
1 ответ
Вы можете добавить несколько заказов, как это,
$qb->addOrderBy('A', 'DESC')
->addOrderBy('B', 'DESC')
->addOrderBy('C', 'DESC');
...и так далее. Вам нужно будет решить, восходящий ли это ASC
или по убыванию DESC
,
Надеюсь это поможет.