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

Joining a table through another join table using withRelated

我有 3 个 tables:

Order: id

Item: id

OrderItems: order_id, item_id

我希望能够获取特定订单并获取与该订单相关的所有项目,而不会因执行 Order.where(...).fetch({withRelated: ['orderItem.item']).

而引入混乱

理想情况下我想做 Order.where(...).fetch({withRelated: ['items']) 并且 items 关系知道要通过 OrderItems table 来获取信息。

我试过关系

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

但这似乎并没有像我预期的那样工作。

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

你试过的关系:

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

到书架的方式:

Item(id, OrderItem_id) -> OrderItem(id, Order_id) -> Order(id)

或 1:n:m 关系。

但是您的数据库显示:

Item(id) <- OrderItem(Item_id, Order_id) -> Order(id)

Bookshelf 地图上的这种关系更好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)

请注意,在您开始将有用的数据放在中间 table 之前,您不需要为其创建模型。

这样,Order.where(...).fetch({withRelated: 'items'}).then(...) 查询应该按预期工作