gpt4 book ai didi

graphql - 如何替换 Fauna 中多对多关系中的所有连接

转载 作者:行者123 更新时间:2023-12-04 08:36:29 24 4
gpt4 key购买 nike

假设我有这个架构:

Client {
services: [Service] @relation(name: "ClientServices")
}
Service {
clients: [Client] @relation(name: "ClientServices")
}
我想将一些服务连接到客户端,如下所示:
mutation {
updateClient(id: ..., data : {
services: {
connect: ["123", "456"] ## where there are valid service _id's
}
}) { ... }
}
极好的。效果很好。
但是现在我想把所有的连接(服务)都换成其他的,但还是保留123服务。
mutation {
updateClient(id: ..., data : {
services: {
connect: ["123", "789"] ## notice kept 123, and now want 789
}
}) { ... }
}
这将导致来自 Fauna 的 instance not unique 错误。因为它试图连接 123 但它已经在 ClientServices 集合中(管理 m-m 关系的自动生成的集合。)
有没有一种简单的方法可以在没有 UDF 的情况下在一次调用中断开所有连接并重新连接我想要的连接?

最佳答案

我相信您可以在同一个突变中连接和断开连接(没有 UDF):

mutation {
updateClient(id: ..., data : {
services: {
connect: ["789"],
disconnect: ["456"]
}
}) { ... }
}
这假设您有能力计算客户端上的差异。例如,使用 lodash:
const _filter = require('lodash/filter');
const _find = require('lodash/find');
const _map = require('lodash/map');

let orig = [{id: "123"}, {id: "456"}]
let replacements = [{id: "123"}, {id: "789"}]

let toConnect = _filter(replacements, o => !_find(orig, {id: o.id}))
let toDisconnect = _filter(orig, o => !_find(replacements, {id: o.id}))

mutate(
// ...
{
connect: _map(toConnect, 'id'),
disconnect: _map(toDisconnect, 'id')
},
// ...
)
作为提供 replace 功能的简单解决方案,也许 Fauna GQL API 可以提供一些关于操作顺序的保证。如果 disconnect 总是在 connect 之前执行,那么你总是可以断开 orig 并连接 replacements 。这种保证似乎是合理的,因为我真的无法想象在同一个 API 调用中连接和立即断开关系的合理理由。

关于graphql - 如何替换 Fauna 中多对多关系中的所有连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64773932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com