Как сделать заказ по рассчитанному столбцу в knexjs

0

Я пытаюсь добавить вычисляемый/вычисленный/виртуальный столбец к запросу, выполнив следующее:

knex.select(knex.raw('DATEDIFF("2018-04-15", STR_TO_DATE(birthdate, "%d/%m/%Y")) / 365.25 as age'))
.from('user')
.orderBy('age', 'desc');

Однако в итоге я получаю следующее сообщение об ошибке:

BadRequest: select count('user'.'id') as 'total' from 'user' order by 'id' desc, 'age' desc - Unknown column 'age' in 'order clause'

Я думаю, что это может иметь что-то с тем, как я структурирую свой запрос, но, похоже, он не распознает вычисляемый столбец как тот, который можно заказать.

Теги:
knex.js

2 ответа

0

Ошибка вашего плохого запроса и запрос knex не совпадают. Ошибка исходит из какого-то другого запроса (запрос счетчика, построенный из этого запроса knex).

Вы можете увидеть сгенерированный запрос здесь: https://runkit.com/embed/4au5bdj29j8j

select DATEDIFF("2018-04-15", STR_TO_DATE(birthdate, "%d/%m/%Y")) / 365.25 as age from 'user' order by 'age' desc

Knex не генерирует никаких счетных запросов автоматически.

Если вы используете простой knex, вы должны отбросить order by .clearOrder из запроса count с .clearOrder метода .clearOrder http://knexjs.org/#Builder-clearOrder

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

0

Вы можете использовать orderByRaw и повторять свое выражение не только как псевдоним

knex.select(knex.raw('DATEDIFF("2018-04-15", STR_TO_DATE(birthdate, "%d/%m/%Y")) / 365.25 as age'))
.from('user')
.orderByRaw('DATEDIFF("2018-04-15", STR_TO_DATE(birthdate, "%d/%m/%Y")) / 365.25', 'desc');

Я думаю, что knex генерирует другой запрос, чтобы получить общее количество записей, исключая часть select().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню