在两个模型上使用 hasMany 处理 Eager Load Error

Posted

技术标签:

【中文标题】在两个模型上使用 hasMany 处理 Eager Load Error【英文标题】:Sequelize Eager Load Error with hasMany on two models 【发布时间】:2020-01-11 09:45:34 【问题描述】:

我有两个模型(课程和公司),它们作为外键关联到日志模型中。我可以在 Log 模型的查询中毫无问题地包含/加入 Course 模型,但是 Company 模型总是会引发 Sequelize Eager Loading 错误。

我尝试在 hasMany 和 belongsTo 关联中使用“as: Companies”,但没有奏效。我也尝试过重新排序,但没有成功。

// The log model

module.exports = (sequelize, DataTypes) => 
  const Log = sequelize.define("Log", 
    user: 
      type: DataTypes.STRING,
      allowNull: false
    ,
    ...other values
  )

  Log.associate = models => 
    models.Log.belongsTo(models.Company, 
      foreignKey: 
        allowNull: false
      
    )
  

  Log.associate = models => 
    models.Log.belongsTo(models.Course, 
      foreignKey: 
        allowNull: false
      
    )
  

  return Log



// the Course model

module.exports = (sequelize, DataTypes) => 
  const Course = sequelize.define("Course", 
    name: 
      type: DataTypes.STRING,
      allowNull: false
    ,
    courseId: 
      type: DataTypes.INTEGER
    
  )

  Course.associate = models => 
    models.Course.hasMany(models.Log)
  

  return Course


// The Company model which does not work in a query:

module.exports = (sequelize, DataTypes) => 
  const Company = sequelize.define("Company", 
    name: 
      type: DataTypes.STRING,
      allowNull: false
    
  )

  Company.associate = models => 
    models.Company.hasMany(models.Log)
  

  return Company


// And finally the query, where swapping the include to be [db.Course] works, however db.Company does not:

db.Log.findAll(
  attributes: [
    "CompanyId",
  ],
  include: [db.Company]
)
.then(dbCompanies => 
  res.json(dbCompanies)
)
.catch(err => res.send(err));```

Including the course model brings in that data without any issue, but any time the company is used, it throws an error. They are identical, from what I can see.

【问题讨论】:

【参考方案1】:

您的逻辑是正确的,但语法错误。加载模型时会调用模型的“关联”方法。您希望将“日志”模型与“公司”和“课程”模型相关联,但是您定义了两次“关联”,并且与 javascript 中的所有变量一样,只有最后一个定义很重要。将“日志”和“公司”模型相关联的原始定义被覆盖,这就是您收到上述错误的原因。

相反,您可以创建一个“关联”方法来创建两个关联:

Log.associate = models => 
  models.Log.belongsTo(models.Company, 
    foreignKey: 
      allowNull: false
    
  )

  models.Log.belongsTo(models.Course, 
    foreignKey: 
      allowNull: false
    
  )

【讨论】:

这解决了它 - 看起来很简单。 Sequelize 没有最用户友好的文档。谢谢!

以上是关于在两个模型上使用 hasMany 处理 Eager Load Error的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eager Loading 在单个注入模型上

如何在 Laravel 8 中获取与 json 有一个 hasMany 关系的表的所有模型?

当同一模型也存在 HasMany 关系时,如何更新 HasOne 关系?

sequelizejs 关系/关联,hasMany/belongsTo vs 定义模型上的参考

TF 2.3 中的错误。当混合 Eager 和 non-Eager Keras 模型时

如何使用在SQLAlchemy和contains_eager中的关系上定义的order_by?