2016-11-12 62 views
1

我有以下情況,我的應用程序有兩個實體:框和具有N到N關係的項目。我正在使用sequelize與MySQL。是否有可能使用sequelize命令中間關係表?

我使用僞代碼來表示表:使用以下通過關係

Box { 
    id: Integer primary key 
    name: String 
} 

Item { 
    id: Integer primary key 
    name: String 
} 

我已經在兩個方向上建立的模式與關係的hasMany:

Box.hasMany(Item, { through: Box_Item }); 
Item.hasMany(Box, { through: Box_Item }); 

Box_Item { 
    id_box: Integer, 
    id_item: Integer, 
    item_order: Integer 
} 

隨着primary_key(id_box,id_item)。

我測試了它,我可以在我的實例對象myBox上調用myBox.getItems(),並輕鬆獲取它所有的項目。

我可以撥打電話爲

BoxModel.findOne({ 
    where: { id: 1 }, 
    include: [{ model: ItemModel }] 
}); 

,它會自動理解存在通過Box_Item模型之間的關係,正確地搞定一切,但我沒有收到由item_order字段排序的結果。該字段是從1到N的數字,表示該框內的項目順序。

我試圖

BoxModel.findOne({ 
    where: { id: 1 }, 
    include: [ 
     { 
      model: ItemModel, 
      order: 'item_order' 
     }   
    ] 
}); 

但似乎sequelizejs不支持爲了裏面包括尚未(在檢查他們的GitHub庫)。

我試圖強迫

BoxModel.findOne({ 
    where: { id: 1 }, 
    order: '`box_model`.`item_order`' 
    include: [ { model: ItemModel } ] 
}) 

通過查詢sequelize尋找創造,但它只是把ORDER BY在兩個不同的地方(內部INNER JOIN,並在查詢結束後,不知道爲什麼。 ..),我得到了一個錯誤。

所以我在stackoverflow上搜索了這個(1),發現了一些問題,但我沒有得到一個使用ORM做這件事的好方法。

當請求特定的箱子物品時,如何獲得按item_order字段排序的物品?

回答

0

經過幾天試圖完成它,我發現stackoverflow幫助我的答案。

創建框和項之間的關係後,我可以在一個實例方便地調用:

myBox.getItems({ 
    order: '`box_model`.`item_order`' 
}); 

然後我得到我期望的結果。但我必須仔細查看sequelize基於模型創建的查詢,並根據其重命名規則獲取正確的字段。

如果您想要,您可以通過as參數並重命名您的表格。

相關問題