首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AdonisJS -更新数组中的许多项

AdonisJS -更新数组中的许多项
EN

Stack Overflow用户
提问于 2020-04-20 11:32:23
回答 2查看 614关注 0票数 1

因此,我使用AdonisJS和PostgreSQL作为后端,并试图找到一种方法,通过SQL或使用AdonisJS模型方法,在不执行循环的情况下更新数组中的许多内容。

我有一个像这样的数组(不。项的数量不确定):

代码语言:javascript
复制
[
      {
        "id":5,
        "name":"aaaaaaa",
        "price":"5689.78",
      },

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

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

假设我有一个名为products的表

EN

回答 2

Stack Overflow用户

发布于 2020-04-20 15:41:32

所以我最终让它起作用了,我使用了一个带有ON冲突子句的INSERT查询

代码语言:javascript
复制
    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"
    )

为了动态更新它,我将给出以下示例代码

代码语言:javascript
复制
     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语句创建了一个查询

代码语言:javascript
复制
    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"
    )
票数 0
EN

Stack Overflow用户

发布于 2022-01-22 21:56:13

您可以使用清晰的透视图。

代码语言:javascript
复制
const Product = use('App/Models/Product')

const productData = request.collect(['id', 'name', 'price'])
await Product.createMany(productData)

createMany方法使查询的行数为n,而不是执行批量插入,其中n是行数。

或者,您可以使用此代码进行批量插入。您必须显式定义返回列。

代码语言:javascript
复制
await Database
  .insert(array)
  .into('products')
  .returning('id')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61314721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档