获取不同类型的关系
Fetching relations with different types
我有以下结构:
对象X:
(id: UUID, name: String, title: String)
对象Y(映射table):
(objectZId: UUID, objectXId: UUID)
我正在尝试通过 objectZId
使用以下代码获取 ObjectX
:
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 没有)。
当您从数据库加载关系数据时,Fetcher
s 支持中间数据结构。此中间数据结构的类型通过 RelRes
类型参数提供。
在您的情况下,当您基于 objectZId
从数据库加载 ObjectX
时,您还需要告诉 fetcher 如何加载 ObjectX
与一个(或多个)相关提供的 objectZId
s (因为您一次加载多个关系)。这就是中间数据结构发挥作用的地方。在您的情况下,它可以像元组一样简单 (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))
我有以下结构:
对象X:
(id: UUID, name: String, title: String)
对象Y(映射table):
(objectZId: UUID, objectXId: UUID)
我正在尝试通过 objectZId
使用以下代码获取 ObjectX
:
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 中使用相同类型时:
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 没有)。
Fetcher
s 支持中间数据结构。此中间数据结构的类型通过 RelRes
类型参数提供。
在您的情况下,当您基于 objectZId
从数据库加载 ObjectX
时,您还需要告诉 fetcher 如何加载 ObjectX
与一个(或多个)相关提供的 objectZId
s (因为您一次加载多个关系)。这就是中间数据结构发挥作用的地方。在您的情况下,它可以像元组一样简单 (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))