如何使用Graphql动态更新一张表中的多行

rj.*_*arn 6 graphql hasura

我是 graphql hasura 的新手,我遇到了如何更新一个表中的多行的问题,因为通常我只更新每个表的一行。

我想以动态方式更新多行

例如,我有现有的行数据。

id: 1, name: 'rosie', age: 12
id: 2, name: 'jane', age: 20
id: 3, name: 'rafaela', age: 25
Run Code Online (Sandbox Code Playgroud)

我只想编辑 2 行。

id: 1, name: 'rosie update', age: 12
id: 2, name: 'jane update', age: 21
Run Code Online (Sandbox Code Playgroud)

我有一系列用户。可以是 1 个或 1 个以上的用户将被更新。

const users = [
{id: 1, name: 'rosie update', age: 12}.
{id: 2, name: 'jane update', age: 21}
];

mutation update_article {
  update_user(
    where: {id: {_eq: users[0].id}},
    _set: {
      name: users[0].name,
      age: users[0].age
   }
  ) {
    affected_rows
  }
}
Run Code Online (Sandbox Code Playgroud)

预期输出应该是:

想要以动态方式而不是静态方式拥有突变代码。

id: 1, name: 'rosie update', age: 12
id: 2, name: 'jane update', age: 21
id: 3, name: 'rafaela', age: 25
Run Code Online (Sandbox Code Playgroud)

mpr*_*net 10

阅读文档突变,你可以使用insert,而不是update能够处理多个管理对象的冲突行为。

在您的示例中,可以通过以下方式完成突变:

mutation update_article {
  insert_user(objects: [
         {id: 1, name: "rosie update", age: 12},
         {id: 2, name: "jane update", age: 21}
      ],
      on_conflict: {
        constraint: user_id_key,
        update_columns: [name, age]
      }
  ) {
    affected_rows
  }
}
Run Code Online (Sandbox Code Playgroud)

由于id值已经存在,它将更新字段nameage

  • 仅当用户具有 id-insert 权限(她不应该这样做)时,这才有效。处理主键是数据库的工作。 (3认同)

Aat*_*thi 5

在不同条件下运行多个更新(V2.10.0)

  1. https://github.com/hasura/graphql-engine/releases/tag/v2.10.0
  2. https://hasura.io/docs/latest/mutations/postgres/update/#multiple-updates
mutation update_many_articles {
  update_article_many (
    updates: [
      {
        where: {rating: {_lte: 1}},
        _set: {is_published: false}
      },
      {
       where: {rating: {_gte: 4}},
        _set: {is_published: true}
      }
    ]
  ) {
    affected_rows
  }
}
Run Code Online (Sandbox Code Playgroud)