Sequelize - 是不是有双向关联?

Posted

技术标签:

【中文标题】Sequelize - 是不是有双向关联?【英文标题】: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 的最佳方法。 【参考方案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 是按约定含义设置的,很可能您一开始就不需要目标键。 :)

以上是关于Sequelize - 是不是有双向关联?的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize 从 belongsTo 关系中获取值

sequelize 是不是可以通过关联表中的属性过滤查询?

Sequelize.js 与非别名关联一起加入别名关联

使用把手显示来自 sequelize 查询的值

kenx JS 和 Sequelize 有啥区别?

使用自定义连接表主键 Sequelize BelongsToMany