我尝试应该是外键关系的一个简单例子。 regions
和subregions
是单独的表格。 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);
});
};