Bookshelf.js 查询相关表行

Posted

技术标签:

【中文标题】Bookshelf.js 查询相关表行【英文标题】:Bookshelf.js query on related table row 【发布时间】: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 感谢您的回复。你能解释一下怎么做吗? 【参考方案1】:

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

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

table:资产,idAttribute:idassetstable: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);
);

【讨论】:

以上是关于Bookshelf.js 查询相关表行的主要内容,如果未能解决你的问题,请参考以下文章

Bookshelf.js 与相关的 TypeScript 错误

如何在 Bookshelf.js 中查询日期

Bookshelf.js 多态关系查询返回空数组

Bookshelf.js belongsToMany 查询列错误

通过 Bookshelf.js 流式传输数据

phpmyadmin:MySQL 的表行数不正确