#node.js #sequelize.js
#node.js #sequelize.js
Вопрос:
У меня есть следующий запрос findAll:
let consumQuery = Manager.consumption.findAndCountAll({
where: query, attributes: ['ml', 'price', 'total', 'consumption_end', 'bar_id', 'sync', 'visit.device_id',
'visit.person.document','visit.person.person_id','visit.person.name','visit.person.surname',
'keg.product_id','keg.product.sku','keg.product.name'],
include: [
{
model: Manager.visit,
attributes: [],
include: [{
model: Manager.person,
attributes: [],
raw: true
}],
},
{
model: Manager.keg,
attributes: [],
include: [
{
model: Manager.product,
required: true,
attributes: []
}
]
}],
limit: PAGE_LIMIT_SIZE,
offset: offset,
raw: true,
order: [['consumption_start', 'ASC']]
}).then(({count, rows}) => {
Я пытаюсь переименовать столбец keg.product.name к пиву.
Я пробовал :
...'keg.product_id','keg.product.sku',['keg.product.name','beer']
Но я получил сообщение об ошибке:
"column "keg.product.name" does not exist"
Sequelize выводит следующий SQL:
sql: `SELECT "consumption"."ml", "consumption"."price", "consumption"."total", "consumption"."consumption_end", "consumption"."bar_id", "consumption"."sync", "visit"."device_id", "visit.person"."document", "visit.person"."person_id", "visit.person"."name", "visit.person"."surname", "keg"."product_id", "keg.product"."sku", "keg.product.name" AS "beer" FROM "public"."consumption" AS "consumption" LEFT OUTER JOIN "public"."visit" AS "visit" ON "consumption"."visit_id" = "visit"."visit_id" LEFT OUTER JOIN "public"."person" AS "visit.person" ON "visit"."person_id" = "visit.person"."person_id" LEFT OUTER JOIN "public"."keg" AS "keg" ON "consumption"."keg_id" = "keg"."keg_id" INNER JOIN "public"."product" AS "keg.product" ON "keg"."product_id" = "keg.product"."product_id" WHERE ("consumption"."bar_id" = '248' AND "consumption"."sync" = 'true' AND "consumption"."consumption_start" >= '2020-02-16 20:03:32.000 -03:00' AND "consumption"."consumption_end" <= '2020-09-17 20:03:32.000 -03:00') ORDER BY "consumption"."consumption_start" ASC LIMIT 500 OFFSET 0;},
Результат есть "keg.product.name" AS "beer"
, но я думаю, что должно быть что-то вроде этого: "keg.product"."name" AS "beer"
Есть идеи?
Комментарии:
1. Вы пробовали
sequelize.col
?2. Я сделал с: [sequelize.literal(‘»keg.product».»name»‘), ‘beer’] и работал
3. @John почему бы просто не поместить эти атрибуты в
keg.product
таблицу?4. Потому что я хочу удалить имя таблицы из выходных данных
Ответ №1:
Чтобы переименовать атрибут, вы должны сделать его похожим на массив [name_in_db, name_you_want]
.
Поэтому значение ваших атрибутов должно быть следующим
attributes: ['ml', 'price', 'total', 'consumption_end', 'bar_id', 'sync', 'visit.device_id', visit.person.document', 'visit.person.person_id', 'visit.person.name', 'visit.person.surname', keg.product_id', 'keg.product.sku', **['keg.product.name', 'beer']**]
Источник: https://sequelize.org/api/v6/class/src/model.js ~модель#статический метод-findAll
«Чтобы переименовать атрибут, вы можете передать массив с двумя элементами — первый — это имя атрибута в базе данных […], а второй — это имя, которое вы хотите, чтобы атрибут имел в возвращаемом экземпляре»