Получение вычисляемых полей с моделями сиквелиза - PullRequest
1 голос
/ 21 апреля 2020

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

Я пробовал два разных способа добавления вычисляемых полей, как в Sequelize.literal, что позвольте мне получить желаемый результат из 2 из трех вариантов использования.

Модель представляет собой систему заказов classi c.

  1. Есть статьи, статьи имеет количество на складе
  2. Есть заказы
  3. заказы имеют строки заказа
  4. строки заказа имеют 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\"",
}

Без необходимости совершать лишние обходы, чтобы получить вычисляемые поля в виде отдельного запроса. Могу ли я получить желаемые значения в системе секвенирования моделей, чтобы у меня были модели как отдельные бизнес-единицы?

...