Sequelize Query,多对多关系问题

时间:2017-03-03 10:11:18

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

我目前有两个MSSQL表。 "项目" table,其中包含Item" Name"和一个托盘"包含托盘的桌子"条形码"。我有一个名为" ItemPallets"的连接表,它将多个项链接到多个托盘。

" ItemPallets"包含项目ID(主键)和托盘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中有三个名称为123的项目,分别为序列号a400,a401和a402,以及托盘DEF中名称为123且序列号为a403的最终项目。

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

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

我目前使用的代码如下:

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

1 个答案:

答案 0 :(得分: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`

所以它返回ItemPallets Item id = 1的所有$this->container->get('security.token_storage')->getToken()->getUser();