2016-01-13 32 views
1

我有如下关系:Sequelize许多一对多格式化

var Order = sequelize.define('order', { 
    id : { 
    type   : Sequelize.INTEGER, 
    primaryKey : true, 
    autoIncrement : true 
    }, 
    amount  : { type : Sequelize.DOUBLE }, 
    change  : { type : Sequelize.DOUBLE }, 
    status  : { type : Sequelize.ENUM('draft', 'placed', 'in_transit', 'fulfilled', 'rejected') }, 
    statusReason : { type : Sequelize.STRING }, 
    address  : { type : Sequelize.STRING }, 
    latitude  : { type : Sequelize.DOUBLE }, 
    longitude : { type : Sequelize.DOUBLE } 
}) 

var Beverage = sequelize.define('beverage', { 
    id : { 
    type   : Sequelize.INTEGER, 
    primaryKey : true, 
    autoIncrement : true 
    }, 
    name : { type : Sequelize.STRING }, 
    picture : { type : Sequelize.STRING }, 
    price : { type : Sequelize.DOUBLE }, 
    max  : { type : Sequelize.DOUBLE }, 
}) 

var OrderBeverage = sequelize.define('orderBeverage', { 
    id : { 
    type   : Sequelize.INTEGER, 
    primaryKey : true, 
    autoIncrement : true 
    }, 
    orderId : { type : Sequelize.INTEGER }, 
    beverageId : { type : Sequelize.INTEGER }, 
    amount  : { type : Sequelize.INTEGER } 
}) 

Order.hasMany(OrderBeverage, { as : 'beverages' }) 
OrderBeverage.belongsTo(Beverage) 
OrderBeverage.belongsTo(Order) 

所以,如果我做一个简单的查询,包括关系,我有以下的源和结果:

let orders = yield Order.findAll({ 
    include : [{ 
    model  : Order.Beverage, 
    as   : 'beverages', 
    attributes : ['createdAt'], 
    include : [ Beverage ] 
    }] 
}) 

以及由此产生的json:

[ 
    { 
    "id": 2, 
    "amount": 0, 
    "change": 0, 
    "status": "placed", 
    "statusReason": "wrong address given", 
    "address": "street x, michigan", 
    "latitude": 0, 
    "longitude": 0, 
    "createdAt": "2016-01-12T22:39:32.000Z", 
    "updatedAt": "2016-01-13T21:05:06.000Z", 
    "beverages": [ 
     { 
     "createdAt": "2016-01-12T23:10:48.000Z", 
     "beverage": { 
      "id": 1, 
      "name": "Vodka", 
      "picture": "somepic", 
      "price": 30, 
      "max": 5, 
      "createdAt": "2016-01-12T22:26:10.000Z", 
      "updatedAt": "2016-01-12T22:26:10.000Z" 
     } 
     } 
    ] 
    } 
] 

我需要使属性beverages成为饮料内容的数组,而不是{ createdAt, beverage }这个饮料的内容是beverage密钥的数组。

最后的结果会是什么样子:

[ 
    { 
    "id": 2, 
    "amount": 0, 
    "change": 0, 
    "status": "placed", 
    "statusReason": "wrong address given", 
    "address": "street x, michigan", 
    "latitude": 0, 
    "longitude": 0, 
    "createdAt": "2016-01-12T22:39:32.000Z", 
    "updatedAt": "2016-01-13T21:05:06.000Z", 
    "beverages": [ 
     { 
      "id": 1, 
      "name": "Vodka", 
      "picture": "somepic", 
      "price": 30, 
      "max": 5, 
      "createdAt": "2016-01-12T22:26:10.000Z", 
      "updatedAt": "2016-01-12T22:26:10.000Z" 
     } 
    ] 
    } 
] 

我已经通过文件搜索,但没有找到它。有任何想法吗?

回答

0

好吧,所以我想出了如何实现这一点。这是不直观以任何方式。

而不是使用与OrderBeverage一个hasMany关系:

Order.hasMany(OrderBeverage, { as : 'beverages' }) 

,我们必须使用与BeveragebelongsToMany关系通过OrderBeverage

Order.belongsToMany(Beverage, { through : 'orderBeverage' }) 

这样,我们只需修改查询是这样的:

let orders = yield Order.findAll({ 
    include : [{ 
    model : Beverage 
    }] 
}) 

我认为这并不使多大意义,因为饮料属于多个orderBeverage,而不是为了通过orderBeverage属于多个饮料

在某种意义上,饮料通过orderBeverage属于许多顺序

也许我误解了这个想法和概念......