与Knex和Bookshelf.js的简单外键关系

时间:2018-03-04 02:41:32

标签: postgresql knex.js bookshelf.js

我尝试应该是外键关系的一个简单例子。 regionssubregions是单独的表格。 regions:subregions之间存在1:多关系,其中表region_fk上的列subregions已映射到表id中的regions。每个表格还有一个name列。目标是返回区域名称和所有子区域的名称。

查询在没有{withRelated: ...}参数的情况下工作正常,因此模型之间的连接必须存在问题。

knex迁移

exports.up = function(knex, Promise) {
  return Promise.all([
    knex.schema.createTable("regions", function(table) {
      table.integer("id").primary();
      table.string("name");
    }),

    knex.schema.createTable("subregions", function(table) {
      table.integer("id").primary();
      table.string("name");
      table
        .integer("region_fk")
        .references("id")
        .inTable("regions");
    }),
  ])
}

bookshelf.config.js

var knex = require("knex")(require("./knexfile.js").development);
var bookshelf = require("bookshelf")(knex);
bookshelf.plugin("registry");
module.exports = bookshelf;

书架模型

// Region
const bookshelf = require("../bookshelf.config");

const Region = bookshelf.Model.extend({
  tableName: "regions",

  subregions: function() {
    return this.hasMany("Subregion", "region_fk");
  },
});

module.exports = bookshelf.model("Region", Region);

// Subregion
const bookshelf = require("../bookshelf.config");
const Subregion = bookshelf.Model.extend({
  tableName: "subregions",

  region: function() {
    return this.belongsTo("Region", "region_fk");
  },
});

module.exports = bookshelf.model("Subregion", Subregion);

查询

const Region = require("../../models/region");

export const getRegionWithId = (req, res) => {
  new Region()
    .where("id", req.params.id)
    .fetch({ withRelated: ["subregions"], require: true })
    .then(region => {
      res.status(200).json(region);
    })
    .catch(err => {
      res.status(404).json(err);
    });
};

0 个答案:

没有答案