Sequelize.js findAll with include to search foreign_key使页面永不加载

时间:2017-04-08 18:06:53

标签: javascript node.js sequelize.js

描述

我有一个简单的数据库,包括Customer,Address和Order。我正在尝试查找地址为字符串的所有订单。例如,我可以提供城市或州,我想基于此查找。

订单表 enter image description here

地址表: enter image description here

订单型号:

module.exports = db.define('orders', {
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    repId: { type: Sequelize.INTEGER },
    totalItemCost: { type: Sequelize.DECIMAL(10,2), allowNull: false},
    shippingCost: { type: Sequelize.DECIMAL(10,2), allowNull: false},
    orderDate: { type: Sequelize.DATE, allowNull: false},
    isPaid: { type: Sequelize.BOOLEAN, allowNull: false},
    taxPercentage: { type: Sequelize.DECIMAL(10,4), allowNull: false},
}, {timestamps: false, freezeTableName: true, tableName: 'Orders'});

地址型号:

module.exports = db.define('address', {
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    firstName: { type: Sequelize.STRING, allowNull: false},
    lastName: { type: Sequelize.STRING, allowNull: false},
    city: { type: Sequelize.STRING, allowNull: false},
    address: { type: Sequelize.STRING(256), allowNull: false},
    zip: { type: Sequelize.STRING(10), allowNull: false},
}, {timestamps: false, freezeTableName: true, tableName: 'Address'});

关系:

var models = {};
models.Address = require("./models/address.js");
models.Customer = require("./models/customer.js");
models.Orders = require("./models/orders.js");

// Orders Relations
models.Orders.belongsTo(models.Customer, { foreignKey: { name: 'customerId', allowNull: false }});
models.Orders.belongsTo(models.Address, { foreignKey: { name: 'shippingAddressId', allowNull: false }});

问题

比如说我想找到这个城市是Birchwood的所有订单。我在findAll命令中使用include,模型设置为我的地址,因为我专门命名了我的送货地址,设置了“as”语句。这导致页面永远不会加载,我不知道我做错了什么。如果我删除include命令,我的所有订单加载正常。当使用“belongsTo”时,我没有看到任何包含的示例。当使用“hasMany”时,看起来使用“association”而不是“foreign_key”。这就是为什么“as”不起作用的问题?

models.Orders.findAll({
    where: where,
    include: [{
        model: models.Address, 
        as: 'shippingAddressId',
    }] 
}).then(function(orders) { 
    res.json(orders);
}).catch(function(err) {
    res.status(500).json({"error": err});
});

编辑1

我在查询语句中添加了错误处理,但现在只输出{“error”:{}}。错误是空白的,所以不是很有帮助。如果我删除“as:'shippingAddressId'”行,则加载模型,并将地址放在json结构中的字段“address”下,这是不希望的。添加where子句会导致它返回一个空对象{}。我基本上想要包括:[{all:true,nested:true}],但也过滤了关系地址。

2 个答案:

答案 0 :(得分:0)

显然查询中存在错误。这就是res.json(orders);从未打过电话的原因。我在代码中看不到错误处理。看看http://bluebirdjs.com/docs/api/catch.html。当你发现错误时,输出它并看看到底发生了什么。

答案 1 :(得分:0)

我通过将关联添加到我的关系来解决了这个问题:

// Orders Relations
models.Orders.belongsTo(models.Customer, { as: 'customer', onDelete: 'CASCADE', foreignKey: { name: 'customerId', allowNull: false }});
models.Orders.belongsTo(models.Address, { as: 'shippingAddress', onDelete: 'CASCADE', foreignKey: { name: 'shippingAddressId', allowNull: false }});
models.Orders.belongsTo(models.PaymentMethod, { as: 'paymentMethod', onDelete: 'CASCADE', foreignKey: { name: 'paymentMethodId', allowNull: false }});
models.OrderItem.belongsTo(models.Orders, { as: 'order', onDelete: 'CASCADE', foreignKey: { name: 'orderId', allowNull: false }});

然后在我的查询中使用该关联名称:

models.Orders.findAll({
    where: where,
    include: [{
        model: models.Address,
        as: 'shippingAddress',
        where: {
            city: {like: "%Wedgewood%" }
        }
    }]
}).then(function(orders) { 
    res.json(orders);
}).catch(function(err) {
    res.status(500).json({"error": err});
});

我的印象是这种关联是自动产生的。