【问题标题】:Sequelize Query, many to many relationship issueSequelize Query,多对多关系问题
【发布时间】:2017-07-23 09:30:37
【问题描述】:

我目前有两个 MSSQL 表。一个“项目”表,其中包含一个项目“名称”和一个“托盘”表,其中包含一个托盘“条形码”。我有一个名为“ItemPallets”的连接表,它将多个项目链接到多个托盘。

“ItemPallets”包含项目 ID(主键)和托盘 ID(主键)以及“序列号”。

数据示例如下:

物品

+ -- + ---- +
| Id | Name |
+ -- + ---- +
| 1  | 123  |
+ -- + ---- +

托盘

+ -- + ------- +
| Id | Barcode |
+ -- + ------- +
| 1  | ABC     |
| 2  | DEF     |
+ -- + ------- +

物品托盘

+ -- + ------ + -------- + ------------- +
| Id | ItemId | PalletId | Serial Number |
+ -- + ------ + -------- + ------------- +
| 1  | 1      | 1        | a400          |
| 2  | 1      | 1        | a401          |
| 3  | 1      | 1        | a402          |
| 4  | 1      | 2        | a403          |
+ -- + ------ + -------- + ------------- +

这意味着 Pallet ABC 中有三个名称为 123 的项目,序列号分别为 a400、a401 和 a402,最后一个项目名称为 123 在 Pallet DEF 中,序列号为 a403。

我正在尝试取回与 Item Pallet 关联的所有 ItemPallet 行,即 Item.Pallet[0].ItemPallets 应该包含一个数组,我希望该数组包含三个 Rows,序列号为 a400 , a401 和 a402。

但是,虽然我的阵列包含两个托盘,但为什么每个托盘只包含一个序列号?

我目前使用的代码如下:

models.Item.findOne({
  where: {id: 1},
  include: [
    { model: models.Pallet }
  ]
});

【问题讨论】:

    标签: sql-server node.js many-to-many sequelize.js


    【解决方案1】:

    您的代码生成的查询返回三行 - 您可以通过将 raw: true 添加到 whereinclude 旁边的选项来查看。我设法得出结论,Sequelize 仅考虑最后返回的行 - 如果您将查询的 order 更改为相反,您将获得序列号为 a403 的ItemPallets

    至于现在我建议你换个方式

    models.ItemPallets.findAll({
        where: {
            ItemId: 1
        }
    }).then((itemPallets) => {
        // here you get all ItemPallets of Item with id 1
    });
    

    我会尝试找出为什么 Sequelize 在这种情况下会出现这样的行为,如果我知道任何有用的信息,请告诉你。

    编辑

    根据您的评论,也可以通过查询Item 表来做到这一点

    models.Item.findByPrimary(1, {
        include: [ models.ItemPallets ]
    }).then((itemWithItemPallets) => {
        // here you get (example output) { id: 1, ItemPallets: [{ id: 1, ItemId: 1, PalletId: 1, serialNumber: a400 }, { ... }]
    });
    

    上面的查询确实

    `JOIN ItemsPallets ON ItemsPallets.ItemId = Item.id WHERE Item.id = 1`
    

    所以它返回Item 中的所有ItemPalletsid = 1

    【讨论】:

    • 对不起,我的错误。该查询实际上返回两行,每个 Pallet 一行。这很好,但是,我希望看到每个托盘内的每个序列号。我需要查询该项目并获取该项目的所有序列号。这需要在项目表上完成,因为我有其他连接和其他特定于项目表的 where 子句。
    • 是的,我的错误也是,返回两行,因为ItemPallets 中有两个项目但是它仍然在每个Pallet 对象上只返回一个ItemPallet。我已经更新了答案,向您展示如何通过查询Item model 来完成
    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2015-07-09
    • 2014-11-11
    相关资源
    最近更新 更多