2017-03-03 37 views
0

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

“ItemPallets”包含项目Id(主键)和Pallet Id(主键)以及“序列号”。

的数据的一个例子可以是:

项目

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

托盘

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

ItemPallets

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

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

我试图找回所有ItemPallet行与项目托盘相关联,即Item.Pallet [0] .ItemPallets应该包含一个数组,我期望该数组包含三个行,序号a400,a401和a402。

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

的代码我目前使用情况如下:

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

回答

0

由代码生成的查询返回三行 - 你可以看到,通过增加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` 

所以返回所有ItemPalletsItemid = 1

+0

对不起,我的错误。查询实际返回两行,每个Pallet一个。这很好,但是,我期望看到每个Pallet中的每个序列号。我需要查询该项目并获取该项目的所有序列号。这需要在项目表上完成,因为我有其他联接和其他where子句特定于Item表。 – KittenKiller

+0

是的,我的错误也返回了两行,因为'ItemPallets'中有两个项目,但它仍然只在每个'Pallet'对象上返回单个'ItemPallet'。我已经更新了答案,向您展示了如何通过查询“Item”模型来完成 – piotrbienias