Использование graphQL и sequelize находят значения предыдущих записей в отсортированном запросе относительно родительского запроса. - PullRequest
1 голос
/ 02 февраля 2020

Редактировать: у меня есть заказ с большим количеством предметов. Элементы имеют один порядок.

Цель состоит в том, чтобы запрос, который возвращает предыдущие значения для столбца элемента в виде массива с длиной предоставленного аргумента.

Так что, если у меня есть :

{
 orders: [
    {
      orderDate: 1,
      items: [
        {
          itemName: 'Item 1',
          orderAmount: 2,
          itemId: '1a'
        },
        {
          itemName: 'Item 2',
          orderAmount: 7,
          itemId: '1b'
        }
      ]
    },
    {
      orderDate: '2',
      items: [
        {
          itemName: 'Item 1',
          orderAmount: 3,
          itemId: '1a'
        },
        {
          itemName: 'Item 2',
          orderAmount: 6,
          itemId: '1b'
        }
      ]
    },
    {
      orderDate: '3',
      items: [
        {
          itemName: 'Item 1',
          orderAmount: 4,
          itemId: '1a'
        },
        {
          itemName: 'Item 2',
          orderAmount: 5,
          itemId: '1b'
        }
      ]
    }
  ]
}

Я хотел бы запрос, который бы возвращал предыдущиеOrders (количество: 2) для возврата ...

  orderDate: 3,
  items: [
    {
      itemName: 'Item 1',
      orderAmount: 4,
      itemId: '1a'
      previousOrders: [3, 2]
    },
    {
      itemName: 'Item 2',
      orderAmount: 5,
      itemId: '1a'
      previousOrders: [6, 7]
    }

В настоящее время я работаю ...

previousOrders: async (item, { count }, { models }) => {
  const previous = await models.Item.findAll({
    attributes: ['id', 'orderAmount'],
    where: {
      itemId: item.itemId
    },
    include: [
      {
        attributes: [],
        model: models.Order
      }
    ],
    order: [[models.Order, 'orderDate', 'desc']],
    raw: true
  })
  const index = previous.findIndex(x => x.id === item.id)
  const sliced = previous.slice(index + 1, index + count + 1)
  const array = sliced.map(a => a.orderAmount)
  while (array.length < count) {
    array.push(0)
  }
  return array

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

...