是否可以使用Graphql和Sequelize执行多租户?

是否可以使用Graphql和Sequelize执行多租户?,graphql,sequelize.js,multi-tenant,Graphql,Sequelize.js,Multi Tenant,我有一个关于GraphQl和多租户的相当棘手的问题 假设有三个表,所有者、房屋和租户。我将在Sequelize和GraphQl伪代码中描述它们: 所有者表(有多个房屋和多个租户) 房屋表(属于业主且有多个租户) 租户表(属于业主和房屋) 所有者graphql对象 const OwnerType = new GraphQLObjectType({ name: 'Owner', fields: () => ({ ownerId: { type: GraphQLInt },

我有一个关于GraphQl和多租户的相当棘手的问题

假设有三个表,所有者房屋租户。我将在Sequelize和GraphQl伪代码中描述它们:

所有者表(有多个房屋和多个租户)

房屋表(属于业主且有多个租户)

租户表(属于业主和房屋)

所有者graphql对象

const OwnerType = new GraphQLObjectType({
  name: 'Owner',
  fields: () => ({
    ownerId: { type: GraphQLInt },
    name: { type: GraphQLString },
    houses: {
      type: GraphQLList(HouseType),
      resolve(owner) {
        return owner.getHouse()
      }
    },
    houseById: {
      type: HouseType,
      args: <args is not defined>
      resolve(owner) {
        return <???>
      }
    },
  })
})
这些客户端查询可以工作:

{
  ownerById(ownerId: 1) {
    ownerId
    name
    house {
      houseId
      name
    }
  }
}

{
  houseById(houseId: 2) {
    houseId
    name
    tenant {
      tenantId
      name
    }
  }
}
我需要做的是让多租户工作如下:

{
  ownerById(ownerId: 1) {
    ownerId
    name
    houseById(houseId: 2) {
      houseId
      name
      tenant {
        tenantId
        name
      }
    }
  }
}
有没有一种方法可以将这个或那个归档到GraphQl所能做的范围之外

如果是,graphql对象
houseById
查询会是什么样子


提前感谢。

除非我遗漏了什么,否则您的
houseById
解析程序似乎与同一类型上的
houses
字段的解析程序没有什么不同

houseById: {
  type: HouseType,
  args: {
    houseId: { type: GraphQLInt },
  },
  async resolve(owner, { houseId }) {
    const houses = await owner.getHouses({ where: { id: houseId } })
    return houses[0]
  }
},
对于
具有多个
关联,目标模型的getter解析为实例数组。因此,我们需要首先获取该数组,然后只返回其中的第一项,因为我们的字段表示单个对象,而不是列表。如果不想使用async/await,还可以执行以下操作:

return owner.getHouses({ where: { id: houseId } })
  .then(houses => houses[0])

还值得一提的是,这种模式违反了惯例。而不是有一个<代码>房屋字段,一个<代码> HouthByid 字段,一个<代码> HouthPosialAdgARG 字段等,考虑使用一个或多个参数,如“代码> ID ”、“代码>名称< /代码>或任何您想提供的过滤标准,来公开单个<代码>房屋字段。然后,您的字段可以根据传入的任何参数筛选房屋,或者如果未提供筛选参数,则返回所有结果。

不清楚您使用
houseById(ownerId:2)
请求什么,至少在您描述的数据模型的上下文中是这样。业主和房屋之间存在一对多的关系。一旦您通过id(
ownerById(ownerId:1)
)获取了所有者节点,该节点的任何字段都将与该特定节点相关。因此,我不确定允许消费者为其中一个字段指定不同的
ownerId
来做什么。你能澄清你的问题吗?你只是在问如何构造一个包含多个查询的请求吗?或者您正在询问如何通过一个或多个任意参数筛选“嵌套”(即非根)字段?还是别的什么?抱歉@DanielRearden
ownerId
应该说
houseId
。我的错…嗨,丹尼尔,你说得对。我只是忘记了
resolve()
函数中的
args
参数。最后,我的野外道具看起来有点不同。我没有传递
owner
并使用
getHouses()
函数,而是导入了Sequelize
models
并像这样使用
findOne()
函数:
resolve(owner,args){return models.house.findOne({where:args})}
{
  ownerById(ownerId: 1) {
    ownerId
    name
    house {
      houseId
      name
    }
  }
}

{
  houseById(houseId: 2) {
    houseId
    name
    tenant {
      tenantId
      name
    }
  }
}
{
  ownerById(ownerId: 1) {
    ownerId
    name
    houseById(houseId: 2) {
      houseId
      name
      tenant {
        tenantId
        name
      }
    }
  }
}
houseById: {
  type: HouseType,
  args: {
    houseId: { type: GraphQLInt },
  },
  async resolve(owner, { houseId }) {
    const houses = await owner.getHouses({ where: { id: houseId } })
    return houses[0]
  }
},
return owner.getHouses({ where: { id: houseId } })
  .then(houses => houses[0])