是否可以使用sequelize来订购中间关系表?

时间:2016-11-12 16:49:12

标签: mysql node.js sequelize.js

我有以下场景,我的应用程序有两个实体:框和具有N到N关系的项目。我正在使用sequelize和MySQL。

我使用伪代码来表示表格:

Box {
  id: Integer primary key
  name: String
}

Item {
  id: Integer primary key
  name: String
}

我使用以下 关系在两个方向上设置了关系hasMany的架构:

Box.hasMany(Item, { through: Box_Item });
Item.hasMany(Box, { through: Box_Item });

Box_Item {
   id_box: Integer,
   id_item: Integer,
   item_order: Integer
}

使用primary_key(id_box,id_item)。

我测试了它,我可以在我的实例对象myBox上调用myBox.getItems()并轻松获取它拥有的所有项目。

我可以拨打电话

BoxModel.findOne({
  where: { id: 1 }, 
  include: [{ model: ItemModel }]
});

它会自动理解通过Box_Item在模型之间存在关联并正确地获取所有内容,除了我没有得到按item_order字段排序的结果。此字段是从1到N的数字,表示该框内的项目顺序。

我试过

BoxModel.findOne({
    where: { id: 1 },
    include: [
       { 
          model: ItemModel, 
          order: 'item_order'
       }           
    ]
});

但似乎sequelizejs不支持内部的顺序包括(在他们的github回购检查)。

我试图强迫

BoxModel.findOne({
    where: { id: 1 },
    order: '`box_model`.`item_order`'
    include: [ { model: ItemModel } ]
})

查看查询sequelize创建,但它只是将ORDER BY放在两个不同的地方(INNER JOIN内部和查询结束时,不知道为什么......)我得到了一个错误。< / p>

所以我在stackoverflow(1)上搜索了这个,发现了一些问题,但是我没有用ORM获得这样做的好方法。

在询问特定的盒子项时,如何获取按item_order字段排序的项目?

1 个答案:

答案 0 :(得分:1)

在尝试完成它几天后,我找到了stackoverflow的答案帮助了我。

创建Box和Item之间的关系后,我可以轻松调用实例:

myBox.getItems({
    order: '`box_model`.`item_order`'
});

然后我得到了我期待的结果。但我必须查看查询sequelize是基于模型创建并根据其重命名规则获取正确的字段。

如果您愿意,可以传递as参数并重命名表格。