2016-07-23 51 views
1

表我有3個表:通過另一加入一個表連接使用withRelated

Order: id

Item: id

OrderItems: order_id, item_id

我希望能夠取得一個特定的順序,並讓所有的與該訂單相關的項目,沒有通過做Order.where(...).fetch({withRelated: ['orderItem.item'])引入混亂。

理想情況下,我想做Order.where(...).fetch({withRelated: ['items'])items關係知道要通過OrderItems表獲取信息。

我已經試過的關係

items() { 
    return this.hasMany('Item').through('OrderItem') 
} 

,但似乎並不如我預料的工作。

這可能使用Bookshelf的API而無需編寫手動連接?

回答

0

您嘗試的關係:

items() { 
    return this.hasMany('Item').through('OrderItem') 
} 

手段的書架:

項目(ID,OrderItem_id) - > OrderItem的(ID,ORDER_ID) - >訂單(ID)

或1:n:m的關係。

但是你的數據庫說:

項目(ID)< - OrderItem的(ITEM_ID,ORDER_ID) - >訂單(ID)

這種在書架關係的映射爲belongsToMany()更好:

bookshelf.plugin('registry') // to ease the cyclic mapping 

const Item = bookshelf.Model.extend({ 
    tableName: 'item', 
    orders: function() { 
    this.belongsToMany('Order', 'OrderItem') 
    }, 
}) 
bookshelf.model('Item', Item) 

const Order = bookshelf.Model.extend({ 
    tableName: 'order', 
    items: function() { 
    //return this.hasMany('Item').through('OrderItem') 
    return this.belongsToMany('Item', 'OrderItem') 
    }, 
}) 
bookshelf.model('Order', Order) 

請注意,直到你開始在中間表上放置有用的數據,你不會編輯爲它創建一個模型。

與那個Order.where(...).fetch({withRelated: 'items'}).then(...)查詢應該按預期工作

+1

非常感謝你@flaviodesousa。這似乎工作。唯一的問題是,我得到「關係」OrderItem「不存在」。我已經將它定義爲使用註冊模型的模型。對我來說,獲得這個工作的唯一方法就是輸入表名。理想情況下,我想保留在一個地方('OrderItem'模型)。任何想法如何讓你的例子工作? – rbhalla

+0

不幸的是,當前版本的書架使用表格而不是模型來執行n:m映射。但正如我在最後一個註釋中提到的那樣,您仍然可以爲中間表創建一個模型,對於您有數據的情況(例如訂單項目的數量和價格)。如何/你在哪裏得到這個「關係」OrderItem「不存在」錯誤? – flaviodesousa

+1

我最初假設,以及採取表名可能需要一個模型,所以出於這個原因,我通過我的中間模型。交換表名稱本身工作得很好。謝謝你的幫助。 – rbhalla

相關問題