GraphQL 介绍-2
上一篇提到了type和field的一些基础介绍,也有说明了如何定义一个query的方法.本篇将会针对mutation进行说明名
Mutation
Mutation是什么?
还记得上一篇文章中有提到在查询时Type Name为Query,除此之外在使用新增,更新和删除时的Type Name一律皆为Mutation
如和使用Mutation?
想像一下在传统的RESTful在进行新增和更新时,在前端是否会将大量的资讯(栏位)传到后端,那么在GraphQL这边我们应该怎么做?
create
先来看create时会发生什么事情
type Meal { id: ID! itemName: String! price: Int! isStopSelling: Boolean!}type Mutation { createMeal( itemName: String! price: Int! isStopSelling: Boolean! ): Boolean!
update
从图片中可以看到,我们成功的定义了一个createMeal的方法,我们可以再来看一下update的案例
type Meal { id: ID! itemName: String! price: Int! isStopSelling: Boolean!}type Mutation { updateMeal( itemName: String! price: Int! isStopSelling: Boolean! id: ID! ): Boolean!
会发现到其实create和update的差异性除了id之外都相同,如果今天前端的栏位多了一个栏位:特价(specialOffer),这个时候可能就要"分别"去createMeal和updateMeal新增这个栏位,虽然看起来好像是一件小事情,但还是可能还是会有少调整到的问题发生因此我们可以使用"Input"帮我们包装资料
Input
input是属于type Declaration里面的另一种关键字,用途就是目前的情境,把一些需要的资料打包起来,一样透过!来定义该资料是否为必填
# Typestype Meal { id: ID! itemName: String! price: Int! isStopSelling: Boolean!}# inputinput MealInput { itemName: String! price: Int! isStopSelling: Boolean!}type Mutation { createMeal(input: MealInput!): Boolean! updateMeal(input: MealInput!, id: ID!): Boolean!
可以看到在这样的状况下,不论我们是要新增或是减少栏位,都只要调整MealInput就可以完成了,不过使用时仍然需要注意是否create和update的传入资料真的完全相同(包含是否为必填),这些还是要依照前端的逻辑来进行处理,若真的不一样时,可能还是得把MealInput拆分为CreateMealInput和updateMealInput来分别管理
delete
最后再来说一下蛮单纯的删除
# Typestype Meal { id: ID! itemName: String! price: Int! isStopSelling: Boolean!}type Mutation { deleteMeal(id: ID!): Boolean!}
其实和RESTful的概念很类似,通常也是传一个id给后端而已
小结:说到这边已经了解了怎么定义一个Type(Meal),还有如何使用Query和Mutation来定义CRUD.此外,在新增和更新时若有相同的栏位可以透过"input"将其包装起来
大概还会有两篇会继续介绍一些GraphQL,虽然会是一些实用性可能没那么高的部分,但还是想完整的分享给大家,如果想了解实作的读者们,可能还得再等等
以上若有错误,还请不吝指教.谢谢
下一篇 GraphQL-Aliases,Fragments,Operation Name