gpt4 book ai didi

javascript - GraphQL 联合和 Sequelize

转载 作者:行者123 更新时间:2023-12-02 22:15:29 26 4
gpt4 key购买 nike

我无法理解如何从 GraphQL 联合检索信息。我有这样的东西:

const 配置文件 = StudentProfile |教师简介

然后在我的解析器中我有:

  Profile: {
__resolveType(obj, context, info) {
if (obj.studentId) {
return 'StudentProfile'
} else if (obj.salaryGrade) {
return 'TeacherProfile'
}
},
},

这不会引发任何错误,但是当我运行这样的查询时:

query {
listUsers {
id
firstName
lastName
email
password
profile {
__typename
... on StudentProfile {
studentId
}
... on TeacherProfile {
salaryGrade
}
}
}
}

这将返回除配置文件之外的所有内容,配置文件仅返回 null。我使用 Sequelize 来处理我的数据库工作,但我对 Unions 的理解是,它只会查找正在查询的 ID 的相关类型,并在查询中返回适当的详细信息。

如果我错了,我怎样才能让这个查询工作?

编辑:

我的列表用户解析器:

const listUsers = async (root, { filter }, { models }) => {
const Op = Sequelize.Op
return models.User.findAll(
filter
? {
where: {
[Op.or]: [
{
email: filter,
},
{
firstName: filter,
},
{
lastName: filter,
},
],
},
}
: {},
)
}

用户模型关系(非常简单,与个人资料无关):

User.associate = function(models) {
User.belongsTo(models.UserType)
User.belongsTo(models.UserRole)
}

和我的通用用户解析器:

User: {
async type(type) {
return type.getUserType()
},

async role(role) {
return role.getUserRole()
},
},

最佳答案

最简单的方法是使用单个表(即 single table inheritance )。

  • 创建一个包含所有类型列的表。例如,它将包括 student_idsalary_grade列,即使这些列将作为架构中不同类型的字段公开。
  • 添加一个“类型”列,用于标识每行的实际类型。在实践中,将此列命名为 __typename 会很有帮助。 (稍后会详细介绍)。
  • 为您的表创建 Sequelize 模型。同样,该模型将包含所有属性,即使它们不适用于特定类型。
  • 定义您的 GraphQL 类型和接口(interface)/联合类型。您可以提供__resolveType方法,根据您添加的“类型”字段返回适当的类型名称。但是,如果您将此字段命名为 __typename并用您要公开的 GraphQL 类型的名称填充它,您实际上可以跳过此步骤!
  • 您可以像平常一样使用您的模型,利用 find查询表或与其创建关联的方法。例如,您可以添加类似 User.belongsTo(Profile) 的关系然后延迟加载它:User.findAll({ include: [Profile] }) .

这种方法的最大缺点是失去数据库和模型级别的验证。也许salary_grade TeacherProfile 永远不应该为 null但您不能通过约束强制执行此操作或设置 allowNull property 的属性为 false 。充其量,您只能依靠 GraphQL 的类型系统来强制验证,但这并不理想。

可以更进一步,为每个单独的“类型”创建额外的 Sequelize 模型。这些模型仍会指向同一个表,但仅包含特定于您为每种类型公开的字段的属性。这样,您至少可以在模型级别强制执行“必需”属性。然后,例如,您使用 Profile用于查询所有配置文件的模型,但使用 TeacherProfile插入或更新教师文件时。这工作得很好,只是要注意你不能使用 sync方法在构建这样的模型时——您需要手动处理迁移。您不应该使用sync无论如何,在生产中,所以这不是一个大问题,但绝对是需要注意的事情。

关于javascript - GraphQL 联合和 Sequelize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59394853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com