Add an array of Objects to a mutation in apollo-react
Solution 1
You should add a new Tag
type to your schema file and connect it to Tutorial
with a new relation:
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")
}
Then you can create a new tutorial and new tags using a nested create mutation like this:
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
}
}
}
`
This post gives more background about other approaches and their trade-offs: https://www.graph.cool/forum/t/how-do-i-add-an-array-of-objects-to-a-mutation-in-apollo-react/365/6?u=nilan
Solution 2
What i understand by your requirement is that if you have the following code
const user = {
name:"Rohit",
age:27,
marks: [10,15],
subjects:[
{name:"maths"},
{name:"science"}
]
};
const query = `mutation {
createUser(user:${user}) {
name
}
}`
you must be getting something like
"mutation {
createUser(user:[object Object]) {
name
}
}"
instead of the expected
"mutation {
createUser(user:{
name: "Rohit" ,
age: 27 ,
marks: [10 ,15 ] ,
subjects: [
{name: "maths" } ,
{name: "science" }
]
}) {
name
}
}"
If this is what you wanted to achieve, then gqlast is a nice tag function which you can use to get the expected result
Simply grab the js file from here and use it as:
const user = {
name:"Rohit",
age:27,
marks: [10,15],
subjects:[
{name:"maths"},
{name:"science"}
]
};
const query = gqlast`mutation {
createUser(user:${user}) {
name
}
}`
The result stored in the variable query
will be :
"mutation {
createUser(user:{
name: "Rohit" ,
age: 27 ,
marks: [10 ,15 ] ,
subjects: [
{name: "maths" } ,
{name: "science" }
]
}) {
name
}
}"
Related videos on Youtube
Josh Pittman
Putting together a course about using React and Firebase together. Also enjoying learning about blockchain tech and it's future implications.
Updated on June 04, 2022Comments
-
Josh Pittman almost 2 years
I am using react-apollo on the front-end and graphcool on the backend. I have a mutation that creates a tutorial like so:
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 } } `
It gets called in a submit handler like so...
this.props.createTutorialMutation({ variables: { author, link, title, completed: false, postedById } })
Everything works wonderfully.
Now I want to add a set of tags to when I create a new tutorial. I created the input field and connected it so that the tags variable is an array of objects, each with a tag id and the tag text.
If I try and add the tags field to the mutation it needs a scalar type. But there is doesn't seem to be a scalar type for an array of objects.
If I pass the tag variable in as a parameter when I call the mutation how do I fill in the Scalar type field in the mutation ( on line 148 here https://github.com/joshpitzalis/path/blob/graphQL/src/components/Add.js) and in the schema?
I am new to graphQL and I understand that I might be approaching this completely the wrong way. If that is the case, how do I add an array of objects to a mutation in graphQL?
-
Malte Schulze-Boeing almost 4 yearsHey man, could you do me a massive favor and take a look at a question I just posted. I think I need to add @relation to a post and shots schema. I am pretty fresh at Apollo, so maybe a silly question: But can can I simply differentiate my client schema from my server schema as long as they match? Coz my server has no idea what "@relation" is. And my client doesn't seem to like it when I start adding local schemas to interface with the server: even when they match stackoverflow.com/questions/62113955/…