【问题标题】:Bookshelf.js query on related table rowBookshelf.js 查询相关表行
【发布时间】:2015-11-25 16:29:55
【问题描述】:

我开始使用 Node.JS、bookshelf.js 和 bookshelf-pagemaker。

我的数据库包含 2 个表: - 具有 3 个主要行的资产(idasset、名称、idarrangement) - Arrangement_details 有 2 个主行(idarrangement_details,材料)

例如,我想获取 material = 2 的所有资产。

资产模型:

var AssetsCollection = DB.Model.extend({ 表名:'资产', idAttribute: 'idassets', 安排细节:函数(){ return this.belongsTo(ArrangementDetail, 'idarrangement_details'); } });

我试过这段代码,但它崩溃了,因为没有加入安排细节。

var pm = require('bookshelf-pagemaker')(DB); 下午(资产集合。资产集合) 。锻造() .limit(req.params.limit) .offset(req.params.page) .查询(函数(qb){ qb.where('Arrangement_details.material', '=', 4) }) .paginate({request: req, withRelated: ['arrangementdetails']) 。结尾({}) .then(函数(结果){ 回调(空,{code:200,res:结果}); });

有可能吗?

问候, 达尔口

【问题讨论】:

  • 就像你说的那样,你需要在查询回调中为排列细节表添加一个连接。您还需要在 where 方法中按名称而不是模型来引用表
  • 嗨@vbranden 感谢您的回复。你能解释一下怎么做吗?

标签: node.js bookshelf.js knex.js bookshelf-pagemaker


【解决方案1】:

您需要加入表格才能搜索相关表格。在没有看到您的表结构的情况下,这将有点像在黑暗中拍摄,但是您应该在查询回调中使用连接以及类似于以下内容的位置。需要明确的是,书架或页面制作器与您要完成的工作没有功能问题。

看来你有 2 张桌子,下面是

table:资产,idAttribute:idassets
table:Arrangement_details,idAttribute:idarrangement_details

var pm = require('bookshelf-pagemaker')(DB);
pm(AssetsCollection.AssetsCollection)
.forge()
//.limit(req.params.limit) -- not needed as you are already passing req to paginate
//.offset(req.params.page) -- not needed as you are already passing req to paginate
.query(function(qb){
    qb.join('Arrangement_details', 'Arrangement_details.idarrangement_details', '=', 'assets.idarrangement_details')
    .where('Arrangement_details.material', '=', 4);
})
.paginate({request: req, withRelated: ['arrangementdetails'])
.end()
.then(function (results) {
    callback(null, {code: 200 , res: results});
});

但是,我鼓励您为表/字段使用较少混淆的名称,类似于以下内容,其中 id 是两者的 idAttribute,details_id 是 belongsTo 关系的外键

var AssetsCollection = DB.Model.extend({
    tableName: 'assets',
    idAttribute: 'id',
    arrangementDetails: function () {
        return this.belongsTo(ArrangementDetail, 'details_id');
    }
});
var ArrangementDetail = DB.Model.extend({
    tableName: 'arrangement_details',
    idAttribute: 'id'
});

var pm = require('bookshelf-pagemaker')(DB);
pm(AssetsCollection.AssetsCollection)
.forge()
.query(function(qb){
    qb.join('arrangement_details', 'arrangement_details.id', '=', 'assets.details_id')
    .where('arrangement_details.material', '=', 4);
})
.paginate({request: req, withRelated: ['arrangementDetails'])
.end()
.then(function (results) {
    callback(null, {code: 200 , res: results});
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多