【发布时间】:2026-02-08 07:05:02
【问题描述】:
强调文本我有一个关于 GraphQl 和多租户的相当棘手的问题。
假设有 3 个表,OWNER、HOUSE 和 TENANTS。我将在 Sequelize 和 GraphQl 伪代码中描述它们:
Owner 表(有多个房屋和多个租户)
const OWNER = sequelize.define('owner', {
ownerId: type: Sequelize.INTEGER,
name: type: Sequelize.STRING
}
OWNER.associate = models => {
models.owner.hasMany(models.house, {foreignKey: {name: 'ownerId', field: 'ownerId'}})
models.owner.hasMany(models.tenant, {foreignKey: {name: 'ownerId', field: 'ownerId'}})
}
房屋表(属于所有者,有多个租户)
const HOUSE = sequelize.define('house', {
houseId: type: Sequelize.INTEGER,
ownerId: type: Sequelize.INTEGER,
name: type: Sequelize.STRING
}
HOUSE.associate = models => {
models.house.belongsTo(models.owner, {foreignKey: {name: 'ownerId', field: 'ownerId'}})
models.house.hasMany(models.tenant, {foreignKey: {name: 'houseId', field: 'houseId'}})
}
租户表(属于业主和房屋)
const TENANT = sequelize.define('tenant', {
tenantId: type: Sequelize.INTEGER,
ownerId: type: Sequelize.INTEGER,
houseId: type: Sequelize.INTEGER,
name: type: Sequelize.STRING
}
TENANT.associate = models => {
models.tenant.belongsTo(models.owner, {foreignKey: {name: 'ownerId', field: 'ownerId'}})
models.tenant.belongsTo(models.house, {foreignKey: {name: 'houseId', field: 'houseId'}})
}
拥有者 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 <???>
}
},
})
})
以下是一些简单的 GraphQL 查询:
ownerById = {
type: OwnerType,
args: {
ownerId: { type: GraphQLInt },
},
resolve(parents, args){
return models.owner.findOne({ where: args })
}
}
houses = {
type: GraphQLList(HouseType),
resolve(parents, args){
return models.house.findAll()
}
}
houseById = {
type: HouseType,
args: {
houseId: { type: GraphQLInt },
},
resolve(parents, args){
return models.house.findOne({ where: args })
}
}
tenants = {
type: GraphQLList(TenantType),
resolve(parents, args){
return models.tenant.findAll()
}
}
这些客户端查询有效:
{
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(ownerId: 2)的要求是什么,至少在您描述的数据模型的上下文中是这样。 Owner 和 House 之间存在一对多的关系。通过 id (ownerById(ownerId: 1)) 获取 Owner 节点后,该节点的任何字段都将与该特定节点相关。因此,我不确定您通过允许消费者为其中一个字段指定不同的ownerId来尝试做什么。你能澄清你的问题吗? -
你是在问如何构造一个包含多个查询的请求吗?或者您是在问如何通过一个或多个任意参数过滤“嵌套”(即非根)字段?还是完全不同的东西?
-
对不起@DanielRearden
ownerId应该说houseId。我的坏...
标签: graphql sequelize.js multi-tenant