Prisma graphql 关系计算域

Posted

技术标签:

【中文标题】Prisma graphql 关系计算域【英文标题】:Prisma graphql computed fields on relations 【发布时间】:2019-08-05 20:16:06 【问题描述】:

我有以下数据模型:

type Tvshow 
  id: ID! @unique
  title: String!
  pricing: [Pricing]
  startDate: DateTime!
  endDate: DateTime!
  subscribers: [Tvshowsubscription!]
 .....


type FavoriteTvshow 
  id: ID! @unique
  tvshow: Tvshow!
  user: User!


type User 
  id: ID! @unique
  name: String
  email: String! @unique
  password: String
  googleID: String @unique
  resetToken: String
  resetTokenExpiry: String
  permissions: [Permission]
  address: Address
  phone: String
  favorites: [FavoriteTvshow!]
  tvshowSubscriptions: [Tvshowsubscription!]

我有使用 addFragmentToInfo 的自定义电视节目解析器:

resolver-queries.js

const Query = 
 ...
  favoriteTvshows: forwardTo('db'),
  tvshow: (parent, args, ctx, info) => 
    const fragment = `fragment EnsureComputedFields on Tvshow  pricing  minQuantity maxQuantity unitPrice subscribers  id `
    return ctx.db.query.tvshow(, addFragmentToInfo(info, fragment))
  ,
 ....
;

tvshow-resolver.js

const Tvshow = 
  countSubscribers: (parent) => 
    return parent.subscribers.length;
  ,

这是一个例子,我有更多的 Tvshow 计算字段

我可以使用 countSubscribers 查询电视节目,这样可以正常工作:

query SINGLE_TVSHOW_QUERY($id: ID!) 
  tvshow(where:  id: $id ) 
    id
    title
    pricing 
      minQuantity
      maxQuantity
      unitPrice
    
    startDate
    endDate
    countSubscribers
  

但我想做的是从返回 countSubscribers 的用户那里获取所有喜爱的电视节目,对此的查询可能是这样的:

query FAVORITES_FROM_USER($userId: ID!) 
    favoriteTvshows(where:  user: id: $userId ) 
      tvshow 
        id
        title
        startDate
        endDate
        countSubscribers
      
    
  

问题是当我查询这个时,在我之前提到的 tvshow-resolver.js 中,父级没有任何订阅者对象

【问题讨论】:

【参考方案1】:

这个错误非常愚蠢,但我还是会发布它。我在查询中需要订阅者

query FAVORITES_FROM_USER($userId: ID!) 
    favoriteTvshows(where:  user: id: $userId ) 
      tvshow 
        id
        title
        startDate
        endDate
        subscribers  <--- 
          id
          quantity
        
        countSubscribers
      
    
  

这样 tvshow-resolver.js 中的父级将拥有订阅者对象

【讨论】:

以上是关于Prisma graphql 关系计算域的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 Prisma 时需要使用 GraphQL 关系?

NestJS 中与 GraphQL 的 Prisma 自关系

GraphQL / Prisma 中的相同类型关系

使用 Prisma + MongoDB + GraphQL 的嵌套关系返回 null

aws amplify graphql 计算域内联解析器

Apollo 和 Prisma Graphql 显式模型关系不可查询