我有以下结构:
对象 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 没有)。