我正在研究nodejs + sequelize + jade web-app来学习nodejs。基本的一切都很清楚,但现在我想提高赌注。我有一个名为品牌的对象(表)。对象产品与品牌有一对多的关系。我喜欢做的是找到所有品牌并在Jade模板中展示它们,并列出其下的产品。
这是一些基本代码
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但是没有使用品牌主键创建正确查询时触发查询。查询是从“品牌”为空的产品中选择*
此外,我想知道我是否正在分配子集合,以便在我的Jade模板中通过这样做来访问它
ul
each item in items
li(class='brandItem')= item.name
ul
each product in item.products
li=product.name
答案 0 :(得分:1)
我学到了两个原则; 首先要查找每个项目的子项,必须使用sequelize query-chainer。这允许我查询它并在完成后将项目集合放入我的jade模板。其次要使用brands.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});
}
});