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 错误