Я пытаюсь добавить вычисляемые поля в свою модель, которую я хочу использовать повторно, не переписывая пользовательские запросы все время.
Я пробовал два разных способа добавления вычисляемых полей, как в Sequelize.literal, что позвольте мне получить желаемый результат из 2 из трех вариантов использования.
Модель представляет собой систему заказов classi c.
- Есть статьи, статьи имеет количество на складе
- Есть заказы
- заказы имеют строки заказа
- строки заказа имеют fk к статье и заказанную сумму.
Я хочу поле в модели товара, похожее на:
article.stockQuantity - SUM(orderrows.orderedQuantity) where order.state <> 'fullfilled'
Так что, когда я смотрю на статью, я вижу, сколько таких статей доступно на складе.
С решением sequelize.literal я могу подобраться. Результат рассчитывается с использованием подзапроса, что хорошо для меня. Ниже приведен пример виртуального поля, которое делает трюк.
const article = sequelize.define('article', {
...
stockQuantity: {
type: Sequelize.DECIMAL
},
availableQuantity: {
type: Sequelize.VIRTUAL(Sequelize.DECIMAL,
[Sequelize.literal(`(COALESCE((select article."stockQuantity" - sum("orderRows"."orderedQuantity") from "orderRows" left join orders on orders.id = "orderRows"."orderId" where "orderRows"."articleId" = article.id and orders."state" <> 'fullfilled'), 0)) as "availableQuantity"`), "availableQuantity"]),
},
...
});
Это работает для перечисления статей с findAll
и для get
полной статьи.
Однако, когда я Попробуй получить заказ, в котором у меня есть список статей, перерыв подзапросов. Поскольку они не могут следовать за переименованием вложенных дочерних элементов в подзапросе.
Получившийся sql четко описывает проблему
--- clipped from the select part of the generated query
"orderRows->article"."name" AS "orderRows.article.name",
(
COALESCE(
(
select
article."stockQuantity" - sum("orderRows"."orderedQuantity")
from
"orderRows"
left join orders on orders.id = "orderRows"."orderId"
where
"orderRows"."articleId" = article.id
and orders."state" <> 'fullfilled'
),
0
)
) as "availableQuantity",
---
Конечно, это дает мне ошибку, так как таблица статьи больше не называется статьей, если включено из order.findAll
:
{
"name": "SequelizeDatabaseError",
"message": "missing FROM-clause entry for table \"article\"",
}
Без необходимости совершать лишние обходы, чтобы получить вычисляемые поля в виде отдельного запроса. Могу ли я получить желаемые значения в системе секвенирования моделей, чтобы у меня были модели как отдельные бизнес-единицы?