Adonis JS - обновить множество элементов из массива - PullRequest
0 голосов
/ 20 апреля 2020

Итак, я использую Adonis JS и PostgreSQL для своего бэкэнда и пытаюсь найти способ обновить многие из массива, не выполняя al oop, либо SQL, либо используя Adonis JS методы модели.

У меня есть такой массив (количество элементов не определено):

[
      {
        "id":5,
        "name":"aaaaaaa",
        "price":"5689.78",
      },

      {
        "id":6,
        "name":"bbbbb",
        "price":"5689.78",
      },

      {
        "id":7,
        "name":"cccc",
        "price":"5689.78",
      }
]

Допустим, у меня есть таблица с именем products

1 Ответ

0 голосов
/ 20 апреля 2020

Чтобы я наконец заработал, я использовал запрос INSERT с предложением ON CONFLICT

    await Database.raw(
      "INSERT INTO products (id, name, price) " +
      "VALUES (5, 'aaaaaaa', 5689.78), (6, 'bbbbb', 5689.78), (7, 'cccc', 5689.78) " +
      "ON CONFLICT (id) " +
      "DO UPDATE SET " +
      "name = EXCLUDED.name, " +
      "category_id = EXCLUDED.category_id, " +
      "price = EXCLUDED.price, " +
      "units = EXCLUDED.units, " +
      "priority = EXCLUDED.priority, " +
      "is_hidden = EXCLUDED.is_hidden"
    )

Для его динамического обновления я дам этот пример кода

     const requestPayload = [
      {
        "id":5,
        "name":"aaaaaaa",
        "price":"5689.78",
      },

      {
        "id":6,
        "name":"bbbbb",
        "price":"5689.78",
      },

      {
        "id":7,
        "name":"cccc",
        "price":"5689.78",
      }
    ]

    // create a string that translate the request payload
    // to this format = "(5, 'aaaaaaa', 5689.78), (6, 'bbbbb', 5689.78), (7, 'cccc', 5689.78)"
    const values = requestPayload.reduce((result, item) => {
      const itemKeys = ['id', 'name', 'price']

      // create a string that translate the product item obj
      // to this format (4, 'aaaa', 111)
      const productValues = itemKeys.reduce((res, productKey) => {
        const productValue = item[productKey]

        if (productKey === 'name') {
          res.push(`'${productValue}'`)
          return res
        }

        res.push(`${productValue}`)

        return res
      }, []).join(', ')

      result.push(`( ${productValues} )`)
      return result
    }, []).join(', ')

    await Database.raw(
      "INSERT INTO products (id, name, price) " +
      "VALUES " + values +
      "ON CONFLICT (id) " +
      "DO UPDATE SET " +
      "name = EXCLUDED.name, " +
      "category_id = EXCLUDED.category_id, " +
      "price = EXCLUDED.price, " +
      "units = EXCLUDED.units, " +
      "priority = EXCLUDED.priority, " +
      "is_hidden = EXCLUDED.is_hidden"
    )

Я чувствую, что должен быть лучший ответ, используя оператор UPDATE вместо оператора INSERT, поэтому, если у вас есть лучший ответ, пожалуйста, ответьте на этот вопрос!

UPDATE:

Я сейчас создал запрос с использованием оператора UPDATE

    await Database.raw(
      "UPDATE products " +
      "SET " +
      "name = prod.name, " +
      "price = prod.price, " +
      "FROM " +
      "( VALUES (5, 'aaaaaaa', 5689.78), (6, 'bbbbb', 5689.78), (7, 'cccc', 5689.78) ) as prod (id, name, price) " +
      "WHERE products.id = prod.id"
    )
...