[英]Sequelize include an attribute from junction table
I'm building a shop, where in the database i have orders and items. 我正在建立一家商店,在数据库中有订单和物品。 Here's the code for the models:
这是模型的代码:
Item: 项目:
var Sequelize = require('sequelize')
var sequelize = require('./sequelize')
var Item = sequelize.define('item', {
image: {
type: Sequelize.STRING,
allowNull: false
},
itemName: {
type: Sequelize.STRING,
allowNull: false,
field: 'item_name'
},
price: {
type: Sequelize.INTEGER,
allowNull: false
}
})
module.exports = Item
Order: 订购:
var Sequelize = require('sequelize')
var sequelize = require('./sequelize')
var Order = sequelize.define('order', {
orderNumber: {
primaryKey: true,
type: Sequelize.UUID,
defaultValue: Sequelize.UUIDV4
},
shop: {
type: Sequelize.INTEGER
},
location: {
type: Sequelize.STRING
}
})
module.exports = Order
They are related through belongs to many: 它们之间的联系通过属于许多方面:
Item.belongsToMany(Order, {through: OrderItem})
Order.belongsToMany(Item, {through: OrderItem})
The OrderItem has an additional field, 'count', which i need to return: OrderItem有一个附加字段“ count”,我需要返回该字段:
var Sequelize = require('sequelize')
var sequelize = require('./sequelize')
var OrderItem = sequelize.define('OrderItem', {
count: Sequelize.INTEGER
})
module.exports = OrderItem
However, when i try to include the OrderItem model, it doesn't work. 但是,当我尝试包括OrderItem模型时,它不起作用。 No errors, nothing.
没有错误,没事。 The query just doesn't return:
查询只是不返回:
Order.findAll({
where: {
userId: userId
},
include: [{
model: Item,
include: [OrderItem]
}]
}).then(orders => {
console.log(orders)
res.status(200).json(orders)
})
How to get what i need from sequeilize? 如何获得我所需要的东西?
You may try something like this: 您可以尝试如下操作:
Order.findAll({
where: {
userId: userId
},
include: [{ model: Item,
as:'item',
through:{attributes:['count']} // this may not be needed
}]
}).then(orders => {
console.log(orders)
res.status(200).json(orders)
})
Also, your models must have a right naming strategy. 此外,您的模型必须具有正确的命名策略。 Eg :
例如:
Item - must have itemId field instead of itemNumber, Order - must have orderId as primary field Item-必须具有itemId字段,而不是itemNumber,Order-必须具有orderId作为主字段
OrderItem's structure: OrderItem的结构:
var OrderItem = sequelize.define('OrderItem', {
orderId: Sequelize.INTEGER,
itemId: Sequelize.INTEGER,
count: Sequelize.INTEGER
})
Another one is to use direct names of related fields and models when you use belongsToMany() 另一种是在使用belongsToMany()时使用相关字段和模型的直接名称。
More here: http://docs.sequelizejs.com/en/latest/docs/associations/ 此处更多信息: http : //docs.sequelizejs.com/en/latest/docs/associations/
I know this is year later, but yet.. 我知道这是一年后的事,但是
You can use the property joinTableAttributes
to get a junction table fields . 您可以使用属性
joinTableAttributes
获取联结表字段。
for example : 例如 :
Order.findAll({
where: {
userId: userId
},
joinTableAttributes: ['count'],
include: [{
model: Item,
}]
}).then(orders => {
console.log(orders)
res.status(200).json(orders)
})
Turns out that the OrderItem is already nested inside the Item object. 原来,OrderItem已经嵌套在Item对象中。 However, this doesn't make a nice return format , so the question is still open.
但是,这不是一个很好的返回格式,因此问题仍然悬而未决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.