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

标签 mysql node.js sequelize.js

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

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

Box {
  id: Integer primary key
  name: String
}

Item {
  id: Integer primary key
  name: String
}

我已经使用以下through 关系在两个方向上设置了具有 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 还不支持 include 中的顺序(在他们的 github repo 上查看)。

我努力过

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

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

所以我在 stackoverflow ( 1 ) 上搜索了这个,发现了一些问题,但我没有找到使用 ORM 进行搜索的好方法。

当询问特定的盒子元素时,我如何才能让元素按 item_order 字段排序?

最佳答案

尝试完成几天后,我在 stackoverflow 上找到了答案这对我有帮助。

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

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

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

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

关于mysql - 是否可以使用 sequelize 来订购中间关系表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40565217/

相关文章:

php - 如何在Mysql中将对象属性设置为null

sequelize.js - 不应该存在的属性上的非空验证错误

node.js - 如何从sequelize中收到的对象中删除属性?

php - 将数据数组转换为 php 中的表

PHP ->mysql 编码错误

php - 将多个具有不同值的复选框插入相应的数据库列

javascript - 为什么github上的nodejs包和npm commit下载的同一个包有差异?

javascript - 在 Node 的对象中使用 'this' ?

javascript - 无法使用 'in' 运算符在中搜索 '_id'

node.js - Sequelize 删除 JSON 中不存在的行