是否可以使用Graphql和Sequelize执行多租户?
我有一个关于GraphQl和多租户的相当棘手的问题 假设有三个表,所有者、房屋和租户。我将在Sequelize和GraphQl伪代码中描述它们: 所有者表(有多个房屋和多个租户) 房屋表(属于业主且有多个租户) 租户表(属于业主和房屋) 所有者graphql对象是否可以使用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 },
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
来做什么。你能澄清你的问题吗?你只是在问如何构造一个包含多个查询的请求吗?或者您正在询问如何通过一个或多个任意参数筛选“嵌套”(即非根)字段?还是别的什么?抱歉@DanielReardenownerId
应该说houseId
。我的错…嗨,丹尼尔,你说得对。我只是忘记了resolve()
函数中的args
参数。最后,我的野外道具看起来有点不同。我没有传递owner
并使用getHouses()
函数,而是导入了Sequelizemodels
并像这样使用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])