Sequelize 包含一个来自 junction table 的属性
Sequelize include an attribute from junction table
我正在建一家商店,我在数据库中有订单和商品。这是模型的代码:
项目:
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
订单:
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
它们通过属于许多相关:
Item.belongsToMany(Order, {through: OrderItem})
Order.belongsToMany(Item, {through: OrderItem})
OrderItem 有一个附加字段 'count',我需要 return:
var Sequelize = require('sequelize')
var sequelize = require('./sequelize')
var OrderItem = sequelize.define('OrderItem', {
count: Sequelize.INTEGER
})
module.exports = OrderItem
但是,当我尝试包含 OrderItem 模型时,它不起作用。没有错误,什么都没有。查询只是不 return:
Order.findAll({
where: {
userId: userId
},
include: [{
model: Item,
include: [OrderItem]
}]
}).then(orders => {
console.log(orders)
res.status(200).json(orders)
})
如何从sequeilize中得到我需要的东西?
原来 OrderItem 已经嵌套在 Item 对象中。然而,这并不是一个很好的 return 格式,所以问题仍然悬而未决。
您可以尝试这样的操作:
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)
})
此外,您的模型必须具有正确的命名策略。例如。 :
Item - 必须有 itemId 字段而不是 itemNumber,
订单 - 必须将 orderId 作为主要字段
OrderItem 的结构:
var OrderItem = sequelize.define('OrderItem', {
orderId: Sequelize.INTEGER,
itemId: Sequelize.INTEGER,
count: Sequelize.INTEGER
})
另一种是在使用belongsToMany()时直接使用相关字段和模型的名称
更多信息:http://docs.sequelizejs.com/en/latest/docs/associations/
我知道这是一年后的事了,但是..
您可以使用 属性 joinTableAttributes
获取联结 table 字段。
例如:
Order.findAll({
where: {
userId: userId
},
joinTableAttributes: ['count'],
include: [{
model: Item,
}]
}).then(orders => {
console.log(orders)
res.status(200).json(orders)
})
我正在使用 Graphql,我在格式化方面遇到了同样的问题。得到结果后做了一个小地图。
例如:
let orders = await Order.findAll({
where: {
userId: userId
},
include: [{ model: Item,
as:'item',
through:{attributes:['count']}
}]
});
let ordersWithCount = orders.map((o) => {
let orderWithCount = {};
orderWithCount = o;
orderWithCount.count = o.OrderItem.count;
return orderWithCount;
});
我正在建一家商店,我在数据库中有订单和商品。这是模型的代码:
项目:
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
订单:
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
它们通过属于许多相关:
Item.belongsToMany(Order, {through: OrderItem})
Order.belongsToMany(Item, {through: OrderItem})
OrderItem 有一个附加字段 'count',我需要 return:
var Sequelize = require('sequelize')
var sequelize = require('./sequelize')
var OrderItem = sequelize.define('OrderItem', {
count: Sequelize.INTEGER
})
module.exports = OrderItem
但是,当我尝试包含 OrderItem 模型时,它不起作用。没有错误,什么都没有。查询只是不 return:
Order.findAll({
where: {
userId: userId
},
include: [{
model: Item,
include: [OrderItem]
}]
}).then(orders => {
console.log(orders)
res.status(200).json(orders)
})
如何从sequeilize中得到我需要的东西?
原来 OrderItem 已经嵌套在 Item 对象中。然而,这并不是一个很好的 return 格式,所以问题仍然悬而未决。
您可以尝试这样的操作:
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)
})
此外,您的模型必须具有正确的命名策略。例如。 :
Item - 必须有 itemId 字段而不是 itemNumber, 订单 - 必须将 orderId 作为主要字段
OrderItem 的结构:
var OrderItem = sequelize.define('OrderItem', {
orderId: Sequelize.INTEGER,
itemId: Sequelize.INTEGER,
count: Sequelize.INTEGER
})
另一种是在使用belongsToMany()时直接使用相关字段和模型的名称
更多信息:http://docs.sequelizejs.com/en/latest/docs/associations/
我知道这是一年后的事了,但是..
您可以使用 属性 joinTableAttributes
获取联结 table 字段。
例如:
Order.findAll({
where: {
userId: userId
},
joinTableAttributes: ['count'],
include: [{
model: Item,
}]
}).then(orders => {
console.log(orders)
res.status(200).json(orders)
})
我正在使用 Graphql,我在格式化方面遇到了同样的问题。得到结果后做了一个小地图。 例如:
let orders = await Order.findAll({
where: {
userId: userId
},
include: [{ model: Item,
as:'item',
through:{attributes:['count']}
}]
});
let ordersWithCount = orders.map((o) => {
let orderWithCount = {};
orderWithCount = o;
orderWithCount.count = o.OrderItem.count;
return orderWithCount;
});