2013-03-22 1 views
10

Я пытаюсь сделать простой запрос в доктрине, но борется.Doctrine orderBy на поле SUM() с псевдонимом

$query->select(array(
    'app_title' => 'u.title', 
    'user_name' => 'u.user_name', 
    'first_used' => 'MIN(u.creation_time)', 
    'last_used' => 'MAX(u.stop_time)', 
    'total_usage' => 'SUM(u.stream_seconds)', 
)) 
->from(self::USAGE_TABLE, 'u') 
->orderBy('total_usage', 'DESC'); 

Очевидно, я получаю сообщение об ошибке о имени столбца не известном, потому что доктрина использует его собственные псевдонимы (sclr4).

Однако, если я попробую и заказаю фактическое значение; SUM (u.stream_seconds), то я получаю непредвиденную скобку в предложении order by, я уверен, что SQL этого не поддерживает.

Итак, я просто пытаюсь помещать данные в таблицу и обрабатывать сортировку столбцов. Это кажется таким простым, как мне это сделать? Есть идеи?

ответ

22
  1. Вы можете сделать заказ в поле результатов SUM, перечислив его в запросе на основе результата сглаживания, используя AS.
  2. Если вы хотите использовать функцию агрегата, такую ​​как MIN(), MAX(), AVG(), вы должны использовать GROUP BY.

Try simmilar к этому, который отлично работает для меня (кстати, вместо ассоциативного массива в select метод):

$q = $this->em()->createQueryBuilder(); 

$q->select(['product.id', 'product.title']) 
    ->addSelect('SUM(product.price) AS HIDDEN stat_sum_realised') 
    ->from('ModuleAdmin\Entity\ProductEntity', 'product') 
    ->groupBy('product.id'); 

$q->orderBy('stat_sum_realised', 'DESC'); 

Агрегатные функции подробно описаны здесь (напр для MySQL): http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

С точки зрения доктрины ORM 2.3 вы также можете использовать ключевое слово HIDDEN, которое позволит избежать (в данном случае) stat_sum_realised от увлажнения в вашем наборе результатов.

+1

Это помогает, теперь у меня возникает проблема, когда я начинаю использовать setFirstResult для разбивки на страницы .. «Исключение произошло при выполнении« SELECT * FROM »(SELECT ROW_NUMBER() OVER (ORDER BY sclr4 DESC) AS doctrine_rownum .. . «Очевидно, дает« Недопустимое имя столбца «sclr4». »Но я не могу понять, как его остановить! – YorkshireDeveloper

+1

@YorkshireDeveloper Вы когда-нибудь выяснили, почему у вас возникло исключение« Неверное имя столбца «sclr4»? У меня такая же проблема. – NSAddict

Смежные вопросы