node.js - Sequelize.js - 如何正确使用关联的 get 方法(每次调用都没有 sql 查询)?

标签 node.js orm sequelize.js

我正在为 ORM 使用 Sequelize.js 并且有一些关联(现在实际上无关紧要)。我的模型从这些关联中获取 getset 方法。像这样(来自文档):

var User = sequelize.define('User', {/* ... */})
var Project = sequelize.define('Project', {/* ... */})

// One-way associations
Project.hasOne(User)

/*
...
Furthermore, Project.prototype will gain the methods getUser and setUser
according to the first parameter passed to define.
*/

现在,我有 Project.getUser(),它返回一个 Promise。但是,如果我对同一个对象调用两次,我将执行两次 SQL 查询。

我的问题是 - 我是否遗漏了什么,或者这是预期的行为?实际上,我不想每次在此对象上调用相同的方法时都进行额外的查询。

如果这是预料之中的——我是否应该将自定义 getter 与我手动填充并返回(如果存在)的成员变量一起使用?或者有什么更聪明的东西? :)

更新 从 DeBuGGeR 的回答来看——我知道我可以在进行查询时使用 includes 来急切加载所有内容,但我根本不需要它,而且我不能一直这样做。如果我一开始就加载我的整个数据库,只是为了理解(根据某些标准)我不需要它,那是浪费资源和巨大的开销。我想根据情况进行额外的查询。但我也不能破坏我拥有的所有模型(DAO 对象)并创建新的模型,其中包含所有信息。我应该能够更新其中缺失的部分(从关系中)。

最佳答案

如果您使用 getUser() 它将进行查询调用,它不会授予您访问用户的权限。您可以根据关联手动将其保存到 project.user 或 project.users。

但是你可以试试Eager Loading

Project.find({
  include: [
    { model: User, as: 'user' } // here you HAVE to specify the same alias as you did in your association
  ]
}).success(function(project){
project.user // contains the user

});

还有 getUser() 的例子。不要指望它会自动缓存用户并且不要巧妙地覆盖它,因为它会产生副作用。 getUser 应该从数据库中获取,它应该!

Project.getUser().then(function(user){
   // user is available and is a sequelize object
   project.user = user; // save project.user and use it till u want to
})

关于node.js - Sequelize.js - 如何正确使用关联的 get 方法(每次调用都没有 sql 查询)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30187289/

相关文章:

node.js - 从使用 Cloud Functions for Firebase 上传的文件中获取下载 URL

javascript - 与 apollo-server 的 Websocket 连接返回乱码的 connectionParams

python - 同一个 id 的多个外键。 Django 。设计模式

arrays - 值未插入到数组中,数组返回空白值

javascript - 为什么在 JavaScript 中导入模块有不同的方法?

node.js - 为 Sails.js 应用程序初始化 MongoDB 数据库和用户的推荐方法是什么?

sql-server - 为 asp.net MVC 应用程序更好地访问数据的路线图

node.js - Sequelize - 嵌套关联查询只检索 1 个数组数据?

mysql - 在 node.js 上使用 coalesce 和 sequelize

javascript - FindAll 包含涉及复杂的多对(多对多)关系(sequelizejs)