findOrCreate 与包含 - sequelize.js

use*_*719 7 javascript sequelize.js

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

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

如果锦标赛“美国南部男子篮球”已经在数据库中(假设 ID 为 1),则应使用 TournamentId: 1 创建比赛。如果数据库中已经有比赛{scoreHome: 97 and TournamentId: 1},则不应创建比赛.

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

  Match.associate = models => {
    Match.belongsTo(models.Tournament)
  }
Run Code Online (Sandbox Code Playgroud)

编辑 这是错误:

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

这工作正常

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

Phi*_*ach 0

我不确定sequelize是否允许这种“深度findOrCreate”。\n但是您可以使用两个查询和sequelize事务来实现所需的效果,以确保两者链接在一起:

\n
const t = await sequelize.transaction();\n\ntry {\n  const [tournament] = await Tournament.findOrCreate({\n    where: {name: "USA South Men's Basketball"},\n    { transaction: t }\n  })\n  const [match] = await Match.findOrCreate({\n    where: {scoreHome: 97, tournamentId: tournament.id},\n    { transaction: t }\n  })\n  t.commit()\n} catch(err)\xc2\xa0{\n  t.rollback()\n}\n
Run Code Online (Sandbox Code Playgroud)\n

它有点冗长,但这样你就可以确定自己在做什么,而且(个人观点)对于在你之后阅读该内容的其他开发人员来说也更具可读性。

\n