在 GraphQL 中删除多对多关系中未使用的标签的同时删除用户?

Remove user while also removing unused tags in many-to-many relationship in GraphQL?

我正在为此使用 Hasura。

例如,我有一个 userstagsusers_tags table 的多对多关系。

用户可以定义多个标签(比如一个人的爱好),每个标签可以属于多个人。

Table users {
  id int [pk increment]
}

Table tags {
  id int [pk increment]
  name text
}

Table users_tags {
  id int [pk increment]
  user [ref: - user.id]
  tag [ref: - tags.id]
}

users_tagstable是多对多table.

创建新用户时,我可以创建新标签并将它们与用户相关联。

但是当一个用户被删除时,如果它们不指向其他用户,我可以使用什么 GraphQL 突变来从 tagsusers_tags 中删除标签。

这取决于您想要的数据模型。如果标签始终只与一个用户关联,您可以去掉 users_tags table 并将用户添加到标签 table.

然后,如果您在引用用户 table 的 id 字段的标签 table 上设置了外键,那么这可以自动完成。

您将有 4 个删除选项:

  • 限制:不允许您删除标签上引用的用户
  • 级联:删除用户时删除标签
  • 设置为空:如果用户被删除,则将此行设置为空
  • 设置默认值:如果用户被删除,将此行设置为默认值

您需要在此处 select 级联选项。

如果您想保留当前的数据模型,您将能够在 users_tags table 上执行此级联,如果标签或用户已删除,但需要一些适当的过程才能删除没有关联用户的标签。

最简单的方法可能是添加自定义 SQL 函数,但您也可以使用以下 graphql 查询来查找具有 0 users_tags 关联的标签,然后提供一个列表删除标签突变的主键。

query CountOfUsersTagsForTag {
  tags {
    id
    users_tags_aggregate {
      aggregate {
        count
      }
    }
  }
}