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 - 是不是有双向关联?的主要内容,如果未能解决你的问题,请参考以下文章