使用withRelated通过另一个连接表连接表

时间:2016-07-23 02:18:11

标签: bookshelf.js

我有3张桌子:

<tr class="control"> <td class="label-cell left-label"> <div class="workitemlabel"> <label class="workitemcontrol-label" for="witc_135_txt" title="[Field Name: Process Start Date]">Start Date:</label> </div> </td> <td class="control-cell"> <div class="workitemcontrol"> <div id="witc_135" class="combo input-text-box date-time drop"> <div class="wrap"> <input type="text" id="witc_135_txt" autocomplete="off" maxlength="255" title="7/7/2016 12:00:00 AM" aria-invalid="false"> </div> <div class="drop bowtie-calendar bowtie-icon"></div> </div> </div> </td> </tr> <tr class="control"> <td class="label-cell left-label"> <div class="workitemlabel"> <label class="workitemcontrol-label" for="witc_136_txt" title="[Field Name: P2P]">P2P:</label> </div> </td> <td class="control-cell"> <div class="workitemcontrol"> <div id="witc_136" class="combo input-text-box date-time drop"> <div class="wrap"> <input type="text" id="witc_136_txt" autocomplete="off" maxlength="255" title="7/29/2016 12:00:00 AM" aria-invalid="false"> </div> <div class="drop bowtie-calendar bowtie-icon"></div> </div> </div> </td> </tr> <span></span>

Order: id

Item: id

我希望能够获取特定订单并获取与该订单相关的所有项目,而不会因执行OrderItems: order_id, item_id而引入混乱。

理想情况下,我想Order.where(...).fetch({withRelated: ['orderItem.item'])Order.where(...).fetch({withRelated: ['items'])关系知道通过items表获取信息。

我尝试了这段关系

OrderItems

但这似乎不像我预期的那样有效。

这是否可以使用Bookshelf的API而无需编写手动连接?

1 个答案:

答案 0 :(得分:0)

你试过的关系:

GET http://localhost:3000/posts/posttopic

书架的手段:

  

Item(id,OrderItem_id) - &gt; OrderItem(id,Order_id) - &gt;顺序(ID)

或1:n:m关系。

但你的数据库说:

  

Item(id)&lt; - OrderItem(Item_id,Order_id) - &gt;顺序(ID)

这种关于Bookshelf地图的关系更好地为belongsToMany()

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

请注意,在您开始在中间表上放置有用数据之前,您无需为其创建模型。

使用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) 查询按预期工作