Sequelize hasOne报错

发布于 2022-09-11 19:32:38 字数 504 浏览 15 评论 0

我有两个表,RolesUsers。现在查Users表的时候想LEFT JOIN Roles表,我用了以下代码:

include: [
  {
    association: model.Users.hasOne(model.Roles, {
      foreignKey: 'id',
      as: 'UserRoles',
    }),
  },
]

然后第一次请求没有问题,之后再请求同一个接口就报错了

stack: SequelizeAssociationError: You have used the alias UserRoles in two separate associations. Aliased associations must have unique aliases.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

丑丑阿 2022-09-18 19:32:38

重名原因不太清楚,但是as字段的值加上时间戳即可

影子是时光的心 2022-09-18 19:32:38

根据调试观察,并且对比了一些例子(包括官方文档)中的使用方式。

hasOnehasMany等建立映射关系的方法,都是有全局性质的,可能是有副作用的

因此映射关系应该类似modle在运行时中只定义一次,而不应该在请求function中多次执行。

会报错的case

async function responseXXX(id) {
  return models.Users.findAll({
    where: { id },
    include: [{
      model.Users.hasOne(model.Roles, { // 每次执行都会重复定义这个关系,第一次响应是正常的,第二次就会报错
        foreignKey: 'id',
        as: 'UserRoles',
      }),
    }]
  })
}

正确的case


const UsersHasOneRoles = model.Users.hasOne(model.Roles, { 
   // 最外部的作用域就定义一下这个映射关系,这样运行周期里只会执行一次
   foreignKey: 'id',
   as: 'UserRoles',
}),

async function responseXXX(id) {
  return models.Users.findAll({
    where: { id },
    include: [{
      association: UsersHasOneRoles // 这里再传入他,这个对象只是类似一个工厂函数,实际查询的时候findAll会找到最新的结果
    }]
  })
}

可能有用的资料:

喜爱皱眉﹌ 2022-09-18 19:32:38

alias别名重复了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文