graphql/graphcool:如何编写一个连接一对一和一对多关系的突变

Posted

技术标签:

【中文标题】graphql/graphcool:如何编写一个连接一对一和一对多关系的突变【英文标题】:graphql/graphcool: How to write a mutation that links both a one:one and a one:many relationship 【发布时间】:2018-07-13 19:51:45 【问题描述】:

我的架构如下:

type Artist @model 
  id: ID! @isUnique
  createdAt: DateTime!
  updatedAt: DateTime!
  name: String! @isUnique
  songkickId: String
  shows: [Show!]! @relation(name: "ArtistShow")


type Show @model 
  id: ID! @isUnique
  createdAt: DateTime!
  updatedAt: DateTime!
  name: String
  songkickId: String
  date: DateTime! 
  soldOut: Boolean!
  pit: Boolean!
  ages: String!
  price: String!
  multiDay: Boolean!
  artists: [Artist!]! @relation(name: "ArtistShow")
  venue: Venue! @relation(name: "ShowVenue")


type Venue @model 
  id: ID! @isUnique
  createdAt: DateTime!
  updatedAt: DateTime!
  name: String! @isUnique
  address: String
  latitude: Float
  longitude: Float
  metro: String
  songkickId: String @isUnique
  shows: [Show!]! @relation(name: "ShowVenue")

我已经编写了突变,给定 JSON 数据,创建 Artists 和 Venues 并将它们返回给我。

当时我想创建一个Show,我有:

    Artist ID 数组 Venue 的 ID 填充其余 Show 数据所需的所有信息(在名为 showInfo 的对象中)

我有一个看起来像这样的突变:

        mutation: gql`
            mutation 
                createShow(
                    date: "$showInfo.date"
                    soldOut: $showInfo.soldOut
                    pit: $showInfo.pit
                    ages: "$showInfo.ages"
                    price: "$showInfo.price"
                    multiDay: $showInfo.multiDay
                ) 
                    id
                
            
        `,

如何编辑它,以便在我正在创建的 Show 和适当的 VenueArtist ID 之间创建关系?

【问题讨论】:

【参考方案1】:

我必须构建 JSON,以便在我编写 Show 时可以访问 Artists 和 Venue 的列表。

然后我必须将每个 ArtistVenue (或验证它们是否已经写入)写入 graphcool 并取回各自的 ID。

然后我执行了如下函数:

async findShowOrCreate (showInfo, artists, venue) 
        const tempDate = new Date(showInfo.date);
        this.logger.info(`BEGIN : write show to graphcool ($showInfo.venue on $tempDate.toDateString())`);

        const showQuery =   `
                                query ($venueId: ID!, $date: DateTime) 
                                    allShows(filter: 
                                            venue: 
                                                id: $venueId
                                            
                                            date: $date
                                    )  
                                            id
                                        
                                
                            `

        const existentialShowTest = await this.client.request(showQuery, 
            venueId: venue, date: showInfo.date)

        if (existentialShowTest.allShows.length < 1)

            const addShowQuery =    `
                                        mutation createShow($artistsIds:[ID!], $venueId:ID  ) 
                                            createShow (
                                                artistsIds: $artistsIds
                                                venueId: $venueId
                                                date: "$showInfo.date"
                                                soldOut: $showInfo.soldOut
                                                pit: $showInfo.pit
                                                ages: "$showInfo.ages"
                                                price: "$showInfo.price"
                                                multiDay: $showInfo.multiDay
                                            ) 
                                                id
                                            
                                        
                                    `
            const finalResult = await this.client.request(addShowQuery, 
                venueId: venue, artistsIds: artists)
                .then(data => 
                 const result = data.createShow.id
                 this.logger.info(`FINISH: write show to graphcool as $result`)
                 return result
                )
                .catch(error => this.logger.error(error));

            return finalResult

         else 
            this.logger.info(`FINISH: found show in graphcool`)
            return existentialShowTest.allShows[0]
        

    

首先运行查询以确保在 graphcool 中不存在代表特定日期和 Venue 联合的 Show,然后运行突变以添加 Show

请注意,此突变的结构专门用于获取现有 VenueArtist 对象(后者以列表形式)的 ID,并将它们作为变量附加到行中:

 client.request(addShowQuery, 
            venueId: venue, artistsIds: artists)

使用graphql-request 库,它允许您将变量散列传递给graphcool 的请求。

【讨论】:

以上是关于graphql/graphcool:如何编写一个连接一对一和一对多关系的突变的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL/graphcool - 关系的突变

GraphQL、Redux、React。间隔保存状态

GraphQL/Graph.cool 查询过滤嵌套关系

如何编写 Netty 客户端以连接到 Signalr 集线器?

如何编写连接到服务器并回答用户的简单 smack 4.2.3 应用程序

如何在连接到 mLab 的 GraphQL 中为“更新”数据编写 Mutation