如何使用 graphql 将动态数量的变量保存到数据库中?
How to save dynamic number of variables into database using graphql?
我正在尝试改变和查询动态变量。在将变量发送到服务器之前,用户可以选择添加任意数量的变量。例如,我的应用程序是一个生产力应用程序,它允许用户添加任意数量的指标来跟踪他们的目标,因此如果 "Gym" 是他们的目标,则指标将为 "running"、"bench press"] 等。我的问题是,我不确定如何将它们保存在数据库中,因为这些用户创建的变量没有预先配置的架构。
我已经成功地使用以下方法将变量发送到后端:
mutation CreateGoal ($title: String!, $description: String, $metric: [Json!]) {
createGoal(
data: {
title: $title
description: $description
metric: { set: $metric }
}
){
id
}
}
架构:
type Mutation {
createGoal(data: CreateGoalInput!): Goal!
}
input CreateGoalInput {
title: String!
description: String
metric: GoalCreatemetricInput
}
input GoalCreatemetricInput {
set: [Json!]
}
一旦变量到达解析器,它就是 Json
格式:
{ set: [ 'running', 'bench press' ] }
通常,我会简单地通过 Prisma
:
保存变量
async createGoal(parent, { data }, { request, prisma }, info) {
const { title, description, metric } = data && data
return prisma.mutation.createGoal({
data: {
user: {
connect: {
email: user.email
}
},
title,
description,
}
}, info)
},
但是,由于变量的数量未知,我如何将 'metric' 保存到我的数据库中?
如果我尝试以下操作:
async createGoal(parent, { data }, { request, prisma }, info) {
const { title, description, metric } = data && data
return prisma.mutation.createGoal({
data: {
user: {
connect: {
email: user.email
}
},
title,
description,
metric,
}
}, info)
},
我收到错误:
Error: Variable "$_v0_data" got invalid value [ "running", "bench
press" ] at "_v0_data.metric"; Field "0" is not defined by type
GoalCreatemetricInput.
如果我尝试:
async createGoal(parent, { data }, { request, prisma }, info) {
const { title, description, metric } = data && data
return prisma.mutation.createGoal({
data: {
user: {
connect: {
email: user.email
}
},
title,
description,
metric: metric.set
}
}, info)
},
我收到错误:
Error: Variable "$_v0_data" got invalid value ["running", "bench
press"] at "_v0_data.metric"; Field "0" is not defined by type
GoalCreatemetricInput. Variable "$_v0_data" got invalid value
["Asdfasdf", "Asdfasdf"] at "_v0_data.metric"; Field "1" is not
defined by type GoalCreatemetricInput.
我认为您根本不需要使用 Json
标量。看起来您正在尝试传递一个字符串数组,因此您可能只需要使用 [String!]
.
而不是 [Json!]
input CreateGoalInput {
title: String!
description: String
metric: [String!]
}
那你应该可以去掉
input GoalCreatemetricInput {
set: [Json!]
}
在这里你应该可以将字符串数组传递给后端:
mutation CreateGoal ($title: String!, $description: String, $metric: [String!]) {
createGoal(
data: {
title: $title
description: $description
metric: $metric
}
){
id
}
}
在你的解析器中,我认为你需要做的就是:
async createGoal(parent, { data }, { request, prisma }, info) {
const { title, description, metric } = data && data
return prisma.mutation.createGoal({
data: {
user: {
connect: {
email: user.email
}
},
title,
description,
metric: { set: metric },
}
}, info)
},
我正在尝试改变和查询动态变量。在将变量发送到服务器之前,用户可以选择添加任意数量的变量。例如,我的应用程序是一个生产力应用程序,它允许用户添加任意数量的指标来跟踪他们的目标,因此如果 "Gym" 是他们的目标,则指标将为 "running"、"bench press"] 等。我的问题是,我不确定如何将它们保存在数据库中,因为这些用户创建的变量没有预先配置的架构。
我已经成功地使用以下方法将变量发送到后端:
mutation CreateGoal ($title: String!, $description: String, $metric: [Json!]) {
createGoal(
data: {
title: $title
description: $description
metric: { set: $metric }
}
){
id
}
}
架构:
type Mutation {
createGoal(data: CreateGoalInput!): Goal!
}
input CreateGoalInput {
title: String!
description: String
metric: GoalCreatemetricInput
}
input GoalCreatemetricInput {
set: [Json!]
}
一旦变量到达解析器,它就是 Json
格式:
{ set: [ 'running', 'bench press' ] }
通常,我会简单地通过 Prisma
:
async createGoal(parent, { data }, { request, prisma }, info) {
const { title, description, metric } = data && data
return prisma.mutation.createGoal({
data: {
user: {
connect: {
email: user.email
}
},
title,
description,
}
}, info)
},
但是,由于变量的数量未知,我如何将 'metric' 保存到我的数据库中?
如果我尝试以下操作:
async createGoal(parent, { data }, { request, prisma }, info) {
const { title, description, metric } = data && data
return prisma.mutation.createGoal({
data: {
user: {
connect: {
email: user.email
}
},
title,
description,
metric,
}
}, info)
},
我收到错误:
Error: Variable "$_v0_data" got invalid value [ "running", "bench press" ] at "_v0_data.metric"; Field "0" is not defined by type GoalCreatemetricInput.
如果我尝试:
async createGoal(parent, { data }, { request, prisma }, info) {
const { title, description, metric } = data && data
return prisma.mutation.createGoal({
data: {
user: {
connect: {
email: user.email
}
},
title,
description,
metric: metric.set
}
}, info)
},
我收到错误:
Error: Variable "$_v0_data" got invalid value ["running", "bench press"] at "_v0_data.metric"; Field "0" is not defined by type GoalCreatemetricInput. Variable "$_v0_data" got invalid value ["Asdfasdf", "Asdfasdf"] at "_v0_data.metric"; Field "1" is not defined by type GoalCreatemetricInput.
我认为您根本不需要使用 Json
标量。看起来您正在尝试传递一个字符串数组,因此您可能只需要使用 [String!]
.
[Json!]
input CreateGoalInput {
title: String!
description: String
metric: [String!]
}
那你应该可以去掉
input GoalCreatemetricInput {
set: [Json!]
}
在这里你应该可以将字符串数组传递给后端:
mutation CreateGoal ($title: String!, $description: String, $metric: [String!]) {
createGoal(
data: {
title: $title
description: $description
metric: $metric
}
){
id
}
}
在你的解析器中,我认为你需要做的就是:
async createGoal(parent, { data }, { request, prisma }, info) {
const { title, description, metric } = data && data
return prisma.mutation.createGoal({
data: {
user: {
connect: {
email: user.email
}
},
title,
description,
metric: { set: metric },
}
}, info)
},