gpt4 book ai didi

sequelize.js - 在 sequelize 和 apollo-server 中从目标解析源关联时了解 'include'

转载 作者:行者123 更新时间:2023-12-03 22:19:58 26 4
gpt4 key购买 nike

我正在为我的阿波罗服务器编写一个解析器(使用 sequelize),并且正在努力理解这个向后关联的解析是如何工作的......我对我的 sequelize 查询中的 include 是如何工作的感到非常困惑。

我的模特协会:

User.hasOne(models.Profile)  <- so the foreign key 'userId' is on the profile table

Profile.belongsTo(models.User) <- foreign key 'userId' still on profile table

我的 graphql 架构:
type Profile {
id: ID!
user: User!
}

我的解析器:(我无法使用 User 查询 where: {profileId: profile.id} 模型,因为 profileId 上不存在 User 外键)所以...我使用 include..
Profile: {
user: async (profile, _args, { models }) => {
return await models.User.findOne({
include: [{
model: models.Profile,
where: { id: profile.id } <- this makes zero sense to me.. id is the id of the Profile row? how does this work??
}]
})

最佳答案

通过使用 include 选项,您将 急切地加载 指定的关联模型。从 docs :

When you are retrieving data from the database there is a fair chance that you also want to get associations with the same query - this is called eager loading.



当您对关联模型进行 include 时,Sequelize 在后台将连接语句附加到它生成的查询。默认情况下,这是一个 LEFT OUTER JOIN 。这意味着如果你写:
User.findAll({ include: [{ model: Profile }] })

结果查询将找到所有用户。如果用户碰巧有个人资料,结果中的相关行也将包括个人资料字段。另一方面,我们可以通过添加 INNER JOIN 选项强制连接为 required:
User.findAll({ include: [{ model: Profile, required: true }] })

因为它是一个 INNER JOIN ,结果查询只返回 拥有个人资料的用户。

当您在 where 中添加 include 时,JOIN 会自动转换为 INNER JOIN (除非您明确将 required 设置为 false )。 where 子句本身实际上成为 ONINNER JOIN 语句的一部分。所以如果我们写:
User.findAll({ include: [{ model: Profile, where: { id: 'someId' } }] })

结果将包括具有 Profile 的所有用户,其中该配置文件的 id 等于 someIdwhere 始终特定于我们包含的模型,因此无需指定我们感兴趣的模型的 id 字段。

最后,如果使用 findOne 而不是 findAll ,Sequelize 只会向查询添加 LIMIT 1,并且该方法解析为模型的单个实例而不是数组。

对连接的完整讨论超出了这个问题的范围。您可以查看这些其他问题以了解更多详细信息:
  • What is the difference between “INNER JOIN” and “OUTER JOIN”?
  • SQL join: where clause vs. on clause
  • 关于sequelize.js - 在 sequelize 和 apollo-server 中从目标解析源关联时了解 'include',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53905806/

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