2014-10-06 84 views
8

在Node.js中使用Sequelize是否可以定义在检索数据时在数据库中计算的字段?Sequelize包含在数据库中计算的计算字段吗?

我明白我可以add a custom getter to the DAO to calculate things in Node,但只能在已经加载的数据。

我的目标是定义了在该数据库运行,因此可以使用子查询使用其它的数据来计算的计算。

例如,我非常喜欢这样做:

Products = Sequelize.define('Product', { 
    'productId': { 
      type: Sequelize.INTEGER, 
      primaryKey: true, 
      autoIncrement: true 
     }, 
    'isProductActive': Sequelize.INTEGER, 
    'productName': Sequelize.STRING, 
    'productPrice': Sequelize.DECIMAL, 


    // This is what I don't think Sequelize supports 
    // but is what I ideally want to do... 
    'totalSales': { 
      type: Sequelize.DECIMAL, 
      subQuery: "SELECT SUM(OD.TotalPrice) FROM OrderDetails OD WHERE OD.productID = Products.productID" 
     } 
}; 

没有办法做到这一点?

现在我使用Sequelize.query来运行自定义查询,但后来我失去了Sequelize的所有功能,发现自己重做了Sequelize已经完成的功能。我的另一个选择是运行两个查询 - 一个完全通过Sequelize获取基本数据,另一个只获取计算数据,然后将计算的数据复制到JavaScript中的对象。

+0

你找到一个解决的办法? – Clarkie 2015-10-20 06:45:55

+0

@Clarkie,我能用视图完成它,所以不理想,但工作。 – 2015-10-20 20:14:14

回答

0

我最终什么事做的是创建数据库内的视图,然后在视图sequelize定义,就像它是一个表,包括计算字段,因为它是图的一部分。

这工作得很好,但效果并不理想。

0

您也许可以使用Sequelize模型getterMethods定义:

Products = Sequelize.define('Product', { 
    'productId': { 
    type: Sequelize.INTEGER, 
    primaryKey: true, 
    autoIncrement: true 
    }, 
    'isProductActive': Sequelize.INTEGER, 
    'productName': Sequelize.STRING, 
    'productPrice': Sequelize.DECIMAL, 


    // This is what I don't think Sequelize supports 
    // but is what I ideally want to do... 

}, { 
    getterMethods: { 
    totalSales: function() { 
     var pId = this.productId 
     // here happened your subQuery: "SELECT SUM(OD.TotalPrice) FROM OrderDetails OD WHERE OD.productID = " + pId 
     return something; 
    } 
    } 
}); 
+1

感谢您的建议,但这不是一回事。它在访问时会运行一个单独的查询,效率显着降低。如果我检索100个产品,然后访问每个产品的总销售额,它将运行101个查询。 – 2015-10-22 13:19:04