首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含- findOrCreate - sequelize.js

包含- findOrCreate - sequelize.js
EN

Stack Overflow用户
提问于 2017-08-06 10:00:50
回答 1查看 1.2K关注 0票数 7

我想要创建一个锦标赛(如果不存在),和一个匹配(如果不存在)相关联的比赛。

代码语言:javascript
复制
let [match, created] = await Match.findOrCreate( {
  where: {scoreHome: 97, Tournament: {name: "USA South Men's Basketball"}}, 
  include: [Tournament]
})

如果“美国南方男篮”比赛已经在db中(假设是id 1),那么应该用TournamentId: 1创建比赛。如果数据库中已经有与{scoreHome: 97 and TournamentId: 1}的匹配,则不应该创建匹配。

代码语言:javascript
复制
  let Match = sequelize.define('Match', {
    scoreHome: DataTypes.INTEGER,
    //...
  })

  Match.associate = models => {
    Match.belongsTo(models.Tournament)
  }

编辑这里是错误:

[错误:无效值对象对象]

这个很好用

代码语言:javascript
复制
let match = await Match.create({
    scoreHome: 97, Tournament: {name: "USA South Men's Basketball"}
  },{include: [Tournament]}
})
EN

回答 1

Stack Overflow用户

发布于 2020-08-20 09:29:57

我不确定续写是否会允许这种“深度findOrCreate”。但是,您可以使用两个查询和sequelize事务来实现想要的效果,以确保这两个查询连接在一起:

代码语言:javascript
复制
const t = await sequelize.transaction();

try {
  const [tournament] = await Tournament.findOrCreate({
    where: {name: "USA South Men's Basketball"},
    { transaction: t }
  })
  const [match] = await Match.findOrCreate({
    where: {scoreHome: 97, tournamentId: tournament.id},
    { transaction: t }
  })
  t.commit()
} catch(err) {
  t.rollback()
}

它有点冗长,但这样您就可以确定自己在做什么,而且(个人意见)也更容易被其他开发人员在您之后阅读。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45530818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档