2

我有以下结构:

对象 X:

(id: UUID, name: String, title: String)

ObjectY(映射表):

(objectZId: UUID, objectXId: UUID) 

我正在尝试ObjectX使用objectZId以下代码获取:

val objectXByZ = RelationIds[ObjectY, UUID]("byObjectZId", c => Seq(c.objectZId))
implicit val objectXId = HasId[ObjectX, UUID](_.id)

val objectX = Fetcher.rel[GraphQLContext, ObjectX, ObjectY, UUID](
    (ctx: GraphQLContext, objectXIds: Seq[UUID]) =>
      ctx.app.service.Service.getObjectXByIds(objectXIds)(ctx.trace),
    (ctx: GraphQLContext, rels: RelationIds[XobjectX]) =>
      ctx.app.service.Service.getObjectYByX(rels(objectXByZ))(ctx.trace)
  )

然后在这里使用它:

...

implicit val textX: ObjectType[GraphQLContext, ObjectX] = deriveObjectType(AddFields(
  Field(
    name = "objectX",
    fieldType = ListType(objectXType),
    resolve = c => TestFetchers.objectX.deferRelSeq(
      TestFetchers.objectXByZ, c.value.id
    )
)

...

但出现错误:

[error]  found   : scala.concurrent.Future[Seq[com.fevo.coco.nut.models.ObjectX]]
[error]  required: scala.concurrent.Future[Seq[com.fevo.coco.nut.models.ObjectY]]
[error] Error occurred in an application involving default arguments.
[error]       ctx.app.service.Service.getObjectYByX(rels(objectXByZ))(ctx.trace)
[error]                                                    ^
[info] scala.concurrent.Future[Seq[com.fevo.coco.nut.models.ObjectX]] <: scala.concurrent.Future[Seq[com.fevo.coco.nut.models.ObjectY]]?
[info] false

根据这个答案,我需要在 fetcher 中使用相同的类型,但是有没有办法使用不同的类型?


另一个问题是当我在 fetcher 中使用相同类型时:

val objectX = Fetcher.rel[GraphQLContext, ObjectX, ObjectX, UUID](
  (ctx: GraphQLContext, objectXIds: Seq[UUID]) =>
    ctx.app.service.Service.getObjectXByIds(objectXIds)(ctx.trace),
  (ctx: GraphQLContext, rels: RelationIds[XobjectX]) =>
    ctx.app.service.Service.getObjectYByX(rels(objectXByZ))(ctx.trace)
  )

我没有得到任何结果(getObjectYByX 执行,但 getObjectXByIds 没有)。

4

1 回答 1

1

Fetcher当您从数据库加载关系数据时,s 支持中间数据结构。这个中间数据结构的类型是通过RelRes类型参数提供的。

在您的情况下,当您ObjectX基于. 这就是中间数据结构发挥作用的地方。在您的情况下,它可以像 tuple 一样简单:objectZIdObjectXobjectZId(ObjectY, ObjectX)

val objectXByZ = Relation[ObjectX, (ObjectY, ObjectX), UUID]("byObjectZId", 
  intermediate ⇒ Seq(intermediate._1.objectZId),
  intermediate ⇒ intermediate._2)

val objectX = Fetcher.rel[GraphQLContext, ObjectX, (ObjectY, ObjectX), UUID](
  (ctx, objectXIds) ⇒ ctx.app.service.Service.getObjectXByIds(objectXIds)(ctx.trace),
  // returns list of tuples: Future[Seq[(ObjectY, ObjectX)]]
  (ctx, rels) ⇒ ctx.app.service.Service.getObjectXRelationsByZIds(rels(objectXByZ))(ctx.trace))
于 2018-07-17T21:08:39.610 回答