在 GraphQL 中删除多对多关系中未使用的标签的同时删除用户?
Remove user while also removing unused tags in many-to-many relationship in GraphQL?
我正在为此使用 Hasura。
例如,我有一个 users
、tags
和 users_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_tags
table是多对多table.
创建新用户时,我可以创建新标签并将它们与用户相关联。
但是当一个用户被删除时,如果它们不指向其他用户,我可以使用什么 GraphQL 突变来从 tags
和 users_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
}
}
}
}
我正在为此使用 Hasura。
例如,我有一个 users
、tags
和 users_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_tags
table是多对多table.
创建新用户时,我可以创建新标签并将它们与用户相关联。
但是当一个用户被删除时,如果它们不指向其他用户,我可以使用什么 GraphQL 突变来从 tags
和 users_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
}
}
}
}