【问题标题】:Sequelize - are there bidirectional associations?Sequelize - 是否有双向关联?
【发布时间】:2018-10-24 12:45:33
【问题描述】:

在 Sequelize ORM http://docs.sequelizejs.com/ 的文档中,我没有看到对模型之间双向关联的任何引用,正如我们从 Java 的 Hibernate 或 PHP 的 Doctrine 中所知道的那样。

那么,Sequelize 不支持开箱即用的双向关联?

【问题讨论】:

  • 你的意思是 M:N 关联吗? [这里]是解释。或者您的意思是当您在 Origin 模型上设置 hasMany 时,还可以从 Destination 模型访问? (docs.sequelizejs.com/manual/tutorial/…)
  • 双向关联可以建立一对一,也可以建立一对多。在一对一的情况下,如果用户有任务,我们可以像task.getUser() 一样做user.getTask() 以及。它不存在。
  • 好的,sequelize 默认不这样做,你必须在模型上注明User.hasMany(Task) 然后Task.belongsTo(User)。我建议在hasMany 上使用别名:as,然后在创建数据库后使用别名belongsTo 对另一个模型也使用别名。我知道这听起来很荒谬,但这是迄今为止我一直在使用 sequelize 的最佳方法。

标签: javascript orm associations sequelize.js


【解决方案1】:

这取决于您所说的开箱即用的意思。

Sequelize 中的双向关联是通过在每个模型上定义两个单一关联来实现的。据我所知没有其他办法。

例如。我们有一个用户模型和一个帖子模型。 Post 模型持有一个来自用户名为 UserId 的外键,这是一个一对多的关联。要双向实现这一点,您应该在 User Model 和 Post 模型上添加一个关联,如下所示。

User.associate = function(models) {
    models.User.hasMany(models.Post, {
        foreignKey:"UserId"
    })
}

Post.associate = function(models)  {
    models.Post.belongsTo(models.User, {
        foreignKey:"UserId"
    })
}

类似的方法适用于任何类型的关联类型。我知道这似乎不是最方便的事情。

【讨论】:

  • 当我还将belongsTo 添加到hasMany 时,它可以工作。所以这是可能的。我不确定foreignKey 语法;它给了我错误。
  • 你用的是什么sequelize版本?
  • 在目标键上也检查这个link..
  • 版本为4.39.1。它以 SQL 错误结束。 (MySQL)。我希望在其中一个模型中出现类似 inverse、backref 的东西。
  • 我使用的是 4.38.0,但使用的是 Postgres 方言。这可能是我写的错,也许 MySQL 不支持目标键。仍然没有什么区别,因为您的外键 ID 是按约定含义设置的,很可能您一开始就不需要目标键。 :)
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2019-03-04
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
相关资源
最近更新 更多