简体   繁体   English

合并包含联结表中的属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM