gpt4 book ai didi

sql-server - Sequelize Query,多对多关系问题

转载 作者:行者123 更新时间:2023-12-03 22:41:35 25 4
gpt4 key购买 nike

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

“ItemPallets”包含Item Id(主键)和Pallet 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,在 Pallet DEF 中有一个名为 123 的最后一个项目,序列号为 a403。

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

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

我目前使用的代码如下:
models.Item.findOne({
where: {id: 1},
include: [
{ model: models.Pallet }
]
});

最佳答案

您的代码生成的查询返回三行 - 您可以通过将 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`

所以它用 ItemPallets 返回 Item 的所有 id = 1

关于sql-server - Sequelize Query,多对多关系问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42576045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com