Sequelize包含联结表

时间:2015-12-27 17:44:24

标签: javascript node.js sequelize.js

我正在建立一个商店,在数据库中我有订单和物品。这是模型的代码:

档案:

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',我需要返回:

var Sequelize = require('sequelize')
var sequelize = require('./sequelize')

var OrderItem = sequelize.define('OrderItem', {
  count: Sequelize.INTEGER
})

module.exports = OrderItem

但是,当我尝试包含OrderItem模型时,它不起作用。没有错误,没有。查询只是没有返回:

Order.findAll({
      where: {
        userId: userId
      },
      include: [{
        model: Item,
        include: [OrderItem]
      }]
    }).then(orders => {
      console.log(orders)
      res.status(200).json(orders)
    })

如何从sequeilize获得我需要的东西?

4 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

condition = ... # something that identifies the relevant rows.
df.loc[condition, 'Name'] = df.loc[condition, 'name']

此外,您的模型必须具有正确的命名策略。例如。 :

项目 - 必须有itemId字段而不是itemNumber, 订单 - 必须将orderId作为主要字段

OrderItem的结构:

  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)
  })

另一种方法是在使用belongsToMany()

时使用相关字段和模型的直接名称

更多信息:http://docs.sequelizejs.com/en/latest/docs/associations/

答案 1 :(得分:2)

我知道这是一年之后,但是......

您可以使用属性joinTableAttributes来获取联结表字段。

例如:

Order.findAll({
  where: {
    userId: userId
  },
  joinTableAttributes: ['count'],
  include: [{
    model: Item,
  }]
}).then(orders => {
  console.log(orders)
  res.status(200).json(orders)
})

答案 2 :(得分:1)

原来,OrderItem已经嵌套在Item对象中。但是,这并不是一个很好的返回格式,所以问题仍然是开放的。

答案 3 :(得分:0)

我正在使用 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;
  });