Доктрина 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');

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

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

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

Ответ 1

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

Попробуйте это, что отлично работает для меня (BTW вместо ассоциативного массива в методе 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');

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

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