findOrCreate with include - sequelize.js

时间:2017-08-06 10:00:50

标签: javascript sequelize.js

我想创建锦标赛(如果不存在),以及与锦标赛相关联的匹配(如果不存在)。

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

如果锦标赛美国南方男子篮球赛#39;已经在数据库中(让我们说id为1),然后应该使用TournamentId创建匹配:1。如果数据库中已经有{scoreHome: 97 and TournamentId: 1}匹配,则不应创建匹配项

  let Match = sequelize.define('Match', {
    scoreHome: DataTypes.INTEGER,
    //...
  })

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

修改 这是错误:

  

[错误:无效的值[object Object]]

这很好用

let match = await Match.create({
    scoreHome: 97, Tournament: {name: "USA South Men's Basketball"}
  },{include: [Tournament]}
})

1 个答案:

答案 0 :(得分:0)

我不确定续集是否会允许此“深度findOrCreate”。 但是您可以使用两个查询和序列事务来确保两个链接在一起,从而达到所需的效果:

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()
}

这有点冗长,但是您可以确定自己的工作,并且(个人观点)对于另一个在您之后阅读该文档的开发人员来说,也更具可读性。