首页 > 解决方案 > 如何在 KnexJS + bookshelf 中查询嵌套外键

问题描述

我将 knexJS 和 bookshelf ORM 用于我的 nodejs 应用程序。问题是,当给出记录 ID 时,我需要查询以获取其“曾孙”记录的列表。目标表中有数千条记录,因此页码和大小也应该作为参数传递,我需要通过查询对其进行排序。获取所有记录后进行过滤不是解决方案。

让我解释一下模型之间的关系。

// MenuItem model
module.exports = (Model, models) => {
  return Model.extend({
    tableName: 'menu_items',
    menu_day() {
      return this.belongsTo(models.MenuDay);
    },
  });
};

这是MenuItem我要列出的模型。如您所见,它MenuDay通过外键与模型相关。

// MenuDay model
module.exports = (Model, models) => {
  return Model.extend({
    tableName: 'menu_days',
    menu_items() {
      return this.hasMany(models.MenuItem);
    },
    menu() {
      return this.belongsTo(models.Menu);
    }
  });
};

MenuDayMenu模型通过外键与模型相关。

// Menu model
module.exports = (Model, models) => {
  return Model.extend({
    tableName: 'menus',
    menu_days() {
      return this.hasMany(models.MenuDay);
    },
    restaurant() {
      return this.belongsTo(models.Restaurant);
    }
  });
};

Menu模型与此相关,Restaurant餐厅 ID 只是作为该职位的输入。

// Restaurant model
module.exports = (Model, models) => {
  return Model.extend({
    tableName: 'restaurants',
    menus() {
      return this.hasMany(models.Menu);
    }
  });
};

我尝试了很多解决方案来解决这个问题,但我在这个问题上浪费了几天时间。不管是什么,任何帮助将不胜感激!你会救我的命。

标签: node.jspostgresqlknex.jsbookshelf.js

解决方案


您可以使用以下withRelated选项fetch()

new Restaurant({id: 1}).fetch({
  withRelated: ['menus.menu_days.menu_items']
}).then(restaurant => {
  const menus = restaurant.related('menus')
  const menuDays = menus.related('menu_days')
  const menuItems = menuDays.related('menu_items')
})

推荐阅读