将对象数组添加到 apollo-react 中的突变
Add an array of Objects to a mutation in apollo-react
我在前端使用react-apollo,在后端使用graphcool。我有一个创建像这样的教程的突变:
const CREATE_TUTORIAL_MUTATION = gql`
mutation CreateTutorialMutation(
$author: String
$link: String
$title: String!
$postedById: ID!
$completed: Boolean!
) {
createTutorial(
author: $author
link: $link
title: $title
postedById: $postedById
completed: $completed
) {
author
link
title
postedBy {
id
name
}
completed
}
}
`
它在提交处理程序中被调用,就像这样...
this.props.createTutorialMutation({
variables: {
author,
link,
title,
completed: false,
postedById
}
})
一切都很好。
现在我想在创建新教程时添加一组标签。我创建了输入字段并将其连接,以便标签变量是一个对象数组,每个对象都有一个标签 id 和标签 text.
如果我尝试将标签字段添加到突变中,它需要一个标量类型。但是对象数组似乎没有标量类型。
如果我在调用突变时将标记变量作为参数传入,我该如何在突变(这里是第 148 行 https://github.com/joshpitzalis/path/blob/graphQL/src/components/Add.js)和模式中填写标量类型字段?
我是 graphQL 的新手,我知道我可能以完全错误的方式处理这个问题。如果是这样,我如何将对象数组添加到 graphQL 中的突变?
您应该向架构文件添加一个新的 Tag
类型,并使用新关系将其连接到 Tutorial
:
type Tutorial {
author: String
completed: Boolean
link: String
title: String!
id: ID! @isUnique
createdAt: DateTime!
updatedAt: DateTime!
postedBy: User @relation(name: "UsersTutorials")
tags: [Tag!]! @relation(name: "TutorialTags")
}
type Tag {
id: ID!
tag: String!
number: Int!
tutorials: [Tutorial!]! @relation(name: "TutorialTags")
}
然后您可以像这样使用嵌套的 create mutation 创建新教程和新标签:
const CREATE_TUTORIAL_MUTATION = gql`
mutation CreateTutorialMutation(
$author: String
$link: String
$title: String!
$tags: [TutorialtagsTag!]!
$completed: Boolean!
$postedById: ID!
) {
createTutorial(
author: $author
link: $link
title: $title
tags: $tags
completed: $completed
postedById: $postedById
) {
author
link
title
postedBy {
id
name
}
completed
tags {
id
text
}
}
}
`
此 post 提供了有关其他方法及其权衡的更多背景信息:https://www.graph.cool/forum/t/how-do-i-add-an-array-of-objects-to-a-mutation-in-apollo-react/365/6?u=nilan
根据您的要求,我的理解是,如果您有以下代码
const user = {
name:"Rohit",
age:27,
marks: [10,15],
subjects:[
{name:"maths"},
{name:"science"}
]
};
const query = `mutation {
createUser(user:${user}) {
name
}
}`
你一定得到了类似
的东西
"mutation {
createUser(user:[object Object]) {
name
}
}"
而不是预期的
"mutation {
createUser(user:{
name: "Rohit" ,
age: 27 ,
marks: [10 ,15 ] ,
subjects: [
{name: "maths" } ,
{name: "science" }
]
}) {
name
}
}"
如果这是你想要实现的,那么 gqlast 是一个很好的标记函数,你可以使用它来获得预期的结果
只需从 here 中获取 js 文件并将其用作:
const user = {
name:"Rohit",
age:27,
marks: [10,15],
subjects:[
{name:"maths"},
{name:"science"}
]
};
const query = gqlast`mutation {
createUser(user:${user}) {
name
}
}`
存储在变量query
中的结果将是:
"mutation {
createUser(user:{
name: "Rohit" ,
age: 27 ,
marks: [10 ,15 ] ,
subjects: [
{name: "maths" } ,
{name: "science" }
]
}) {
name
}
}"
我在前端使用react-apollo,在后端使用graphcool。我有一个创建像这样的教程的突变:
const CREATE_TUTORIAL_MUTATION = gql`
mutation CreateTutorialMutation(
$author: String
$link: String
$title: String!
$postedById: ID!
$completed: Boolean!
) {
createTutorial(
author: $author
link: $link
title: $title
postedById: $postedById
completed: $completed
) {
author
link
title
postedBy {
id
name
}
completed
}
}
`
它在提交处理程序中被调用,就像这样...
this.props.createTutorialMutation({
variables: {
author,
link,
title,
completed: false,
postedById
}
})
一切都很好。
现在我想在创建新教程时添加一组标签。我创建了输入字段并将其连接,以便标签变量是一个对象数组,每个对象都有一个标签 id 和标签 text.
如果我尝试将标签字段添加到突变中,它需要一个标量类型。但是对象数组似乎没有标量类型。
如果我在调用突变时将标记变量作为参数传入,我该如何在突变(这里是第 148 行 https://github.com/joshpitzalis/path/blob/graphQL/src/components/Add.js)和模式中填写标量类型字段?
我是 graphQL 的新手,我知道我可能以完全错误的方式处理这个问题。如果是这样,我如何将对象数组添加到 graphQL 中的突变?
您应该向架构文件添加一个新的 Tag
类型,并使用新关系将其连接到 Tutorial
:
type Tutorial {
author: String
completed: Boolean
link: String
title: String!
id: ID! @isUnique
createdAt: DateTime!
updatedAt: DateTime!
postedBy: User @relation(name: "UsersTutorials")
tags: [Tag!]! @relation(name: "TutorialTags")
}
type Tag {
id: ID!
tag: String!
number: Int!
tutorials: [Tutorial!]! @relation(name: "TutorialTags")
}
然后您可以像这样使用嵌套的 create mutation 创建新教程和新标签:
const CREATE_TUTORIAL_MUTATION = gql`
mutation CreateTutorialMutation(
$author: String
$link: String
$title: String!
$tags: [TutorialtagsTag!]!
$completed: Boolean!
$postedById: ID!
) {
createTutorial(
author: $author
link: $link
title: $title
tags: $tags
completed: $completed
postedById: $postedById
) {
author
link
title
postedBy {
id
name
}
completed
tags {
id
text
}
}
}
`
此 post 提供了有关其他方法及其权衡的更多背景信息:https://www.graph.cool/forum/t/how-do-i-add-an-array-of-objects-to-a-mutation-in-apollo-react/365/6?u=nilan
根据您的要求,我的理解是,如果您有以下代码
const user = {
name:"Rohit",
age:27,
marks: [10,15],
subjects:[
{name:"maths"},
{name:"science"}
]
};
const query = `mutation {
createUser(user:${user}) {
name
}
}`
你一定得到了类似
的东西"mutation {
createUser(user:[object Object]) {
name
}
}"
而不是预期的
"mutation {
createUser(user:{
name: "Rohit" ,
age: 27 ,
marks: [10 ,15 ] ,
subjects: [
{name: "maths" } ,
{name: "science" }
]
}) {
name
}
}"
如果这是你想要实现的,那么 gqlast 是一个很好的标记函数,你可以使用它来获得预期的结果
只需从 here 中获取 js 文件并将其用作:
const user = {
name:"Rohit",
age:27,
marks: [10,15],
subjects:[
{name:"maths"},
{name:"science"}
]
};
const query = gqlast`mutation {
createUser(user:${user}) {
name
}
}`
存储在变量query
中的结果将是:
"mutation {
createUser(user:{
name: "Rohit" ,
age: 27 ,
marks: [10 ,15 ] ,
subjects: [
{name: "maths" } ,
{name: "science" }
]
}) {
name
}
}"