Sequelize - 自我引用有很多关系

时间:2014-07-14 23:28:47

标签: javascript node.js sequelize.js

我正在使用Sequelize和Mysql。

我有一张桌子:

  

产品

包含字段:

  

{ID,名称,价格}

我想在项目中与自己建立自我关系。 能够执行Item.subItems并获取属于该项目的所有子项的列表的目标。

请告诉我如何在

中加入新模型
  

包括:[{model:SubItem}] ...当我获取查询时。

我尝试了很多关系选择:

  

Item.hasMany(Item,{through:SubItem,as:'subItems'});

     

Item.hasMany(项目);

感谢您的帮助!

1 个答案:

答案 0 :(得分:17)

创建自引用

Item.hasMany(Item, {as: 'Subitems'}) 

使用include

查找子项目
Item.find({where:{name: "Coffee"},include:[{model: Item, as: 'Subitems'}]})

请参阅下面的示例代码,

var Sequelize = require('sequelize')
, sequelize = new Sequelize("test", "root", "root", {logging: false})
, Item    = sequelize.define('Item', { name: Sequelize.STRING })

Item.hasMany(Item, {as: 'Subitems'})


var chainer = new Sequelize.Utils.QueryChainer
, item  = Item.build({ name: 'Coffee' })
, subitem1 = Item.build({ name: 'Flat White' })
, subitem2 = Item.build({ name: 'Latte' })


sequelize.sync({force:true}).on('success', function() {
  chainer
    .add(item.save())
    .add(subitem1.save())
    .add(subitem2.save())

  chainer.run().on('success', function() {
    item.setSubitems([subitem1, subitem2]).on('success', function() { 

    /*  One way 
      item.getSubitems().on('success', function(subitems) {
        console.log("subitems: " + subitems.map(function(subitem) { 
          return subitem.name 
        }))
      })
    */

    //The include way you asked
    Item.find({where:{name: "Coffee"},include:[{model: Item, as: 'Subitems'}]}).success(function(item) {
         console.log("item:" + JSON.stringify(item));
    })

  })
}).on('failure', function(err) {
    console.log(err)
  })
})

日志数据如下:

项:{ “ID”:1, “名称”: “咖啡”, “createdAt”: “2014-08-05T06:25:47.000Z”, “updatedAt”:“2014-08-05T06:25: 47.000Z“,”ItemId“:null,”subitems“:[{”id“:2,”name“:”Flat White“,”createdAt“:”2014-08-05T06:25:47.000Z“,”updatedAt“ “:” 2014-08-05T06:25:47.000Z “ ”项目Id“:1},{ ”ID“:3 ”名称“: ”拿铁“, ”createdAt“:” 2014-08-05T06:25: 47.000Z”, “updatedAt”: “2014-08-05T06:25:47.000Z”, “项目Id”:1}]}