2017-03-03 11 views
0

私は現在2つのMSSQLテーブルを持っています。パレット「バーコード」を含むアイテム「名前」および「パレット」テーブルを含む「アイテム」テーブル。私はこれらの複数のアイテムを複数のパレットにリンクする "ItemPallets"と呼ばれる結合テーブルを持っています。Sequelize Query、多対多関係の問題

"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という名前の3つのアイテムがあり、シリアル番号a400、a401およびa402、パレットDEFにシリアル番号a403の123という名前の最後のアイテムがあることを意味します。

Itemパレットに関連付けられたItemPallet行をすべて取り戻そうとしています。つまり、Item.Pallet [0] .ItemPalletsは配列を含む必要があります。配列には、シリアル番号を含む3つの行a400、a401、a402である。

しかし、私の配列には両方のパレットが含まれていますが、なぜこれらのパレットにはそれぞれシリアル番号が1つしかありませんか?次のように

私が現在使用しているコードは次のとおりです。

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

答えて

0

あなたのコードによって生成されたクエリは、3行を返します - あなたはwhereincludeの隣のオプションにraw: trueを追加することによって、それを見ることができます。 Sequelizeは最後に返された行だけを考慮していると結論づけることができました。クエリのorderを反対に変更すると、シリアル番号a403のItemPalletsが得られます。用

としては、今私はあなたがそれを他の方法を行うことをお勧め

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

私はSequelizeこの状況でそのように振る舞う理由を見つけると私は有益な何かを知っていれば、あなたが知っているようにしようとします。

EDIT

があなたのコメントによると、クエリの上に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を返しませんItemid = 1とします。

+0

申し訳ありませんが、私の間違い。クエリは、実際にはパレットごとに1つずつ、2つの行を返します。これは問題ありませんが、各パレット内のシリアル番号を確認することができます。私はアイテムを照会し、そのアイテムのすべてのシリアル番号を取得する必要があります。 Itemテーブルに固有の他の結合や他のwhere節があるので、これはアイテムテーブルで行う必要があります。 – KittenKiller

+0

はい、私の間違いも 'ItemPallets'に2つの項目があるので2行を返しますが、' Pallet'オブジェクトごとに単一の 'ItemPallet'しか返しません。私は答えを更新して、 'Item'モデルを照会することによってどのようにそれを行うことができるかを示しました – piotrbienias