+的NodeJS + Sequelize玉; 在对象上使用hasMany集合

我正在研究nodejs + sequelize + jadenetworking应用来学习nodejs。 一切基本都很清楚,但现在我想要赌注。 我有对象(表)叫品牌。 目标产品与品牌有一对多的关系。 我喜欢做的是find所有品牌,并在翡翠模板中显示,并列出下面的产品。

这里是一些基本的代码

var Brand = sequelize.import(application_root + "/models/brand.js"); var Product = sequelize.import(application_root + "/models/product.js"); Brand.hasMany(Product, { as: 'Products', foreignKey: 'brand'}); Product.belongsTo(Brand, { foreignKey: 'key'}); 

在展示品牌和产品的路线上,

  Brand.findAll().error(errorHandler).success(function(brands) { brands[0].getProducts().success(function(products) { brands[0].products = products; }); res.render('listOfbrands.jade', { title: 'List of brands', items: brands}); }); 

最奇怪的是,当console.log被执行时,我可以看到一个查询被触发,但是它并没有用品牌的主键创build一个正确的查询。 查询是从“品牌”为空的产品中select*

另外我想知道如果我正在分配正确的子集合来访问它在我的Jade模板中这样做

 ul each item in items li(class='brandItem')= item.name ul each product in item.products li=product.name 

我学到了两条原则, 首先要查找每个项目的子项目,必须使用sequelize query chainer。 这允许我查询所有,并在完成后将项目集合我的玉模板。 第二个使用品牌.forEach所以我最终的代码就像

  Brand.findAll().error(errorHandler).success(function(brands) { var chainer = new Sequelize.Utils.QueryChainer(); brands.forEach(function(theBrand) { chainer.add(theBrand.getProducts({where: "brand="+theBrand.key }).error(errorHandler).success(function(products) { theBrand.products = products; })); } chainer.runSerially().success(function(results) { res.render('listOfbrands.jade', { title: 'List of brands', items: brands}); } }); 
    Interesting Posts