Bookshelf.js或Knex.js中两个表的外连接

5

我刚接触Bookshelf.js和knex,需要在Bookshelf / knex中编写与此相等的查询语句。

SELECT Inv.*, Comp.* 
FROM  Inv,   Comp
WHERE Inv.uId =2 AND Comp.cId = Inv.cId;

Inv表包含以下信息:

Id     | 主键,整数非空类型
col1   | 字符串数据
cId    | 整数,外键参考C表
uId    | 整数,外键参考U表      

Comp表包含以下信息:

cId     | 主键,整数非空类型 
col3    | 字符串数据
1个回答

7
使用knex查询构建器。假设Invs是模型Inv的集合,代码可能类似于:
Invs.forge().query(function(qb) {
  qb.join('Comp', 'Comp.cId', '=', 'Inv.cId');
  qb.where('Inv.uId', 2);
}).fetch({withRelated: 'comps'}).then(...)

这里的comps是在Inv模型中定义的关系。你也可以完全跳过bookshelf,直接通过bookshelf.knex使用knex来形成所需的精确查询:

bookshelf.knex('Inv')
  .join('Comp', 'Comp.cId', '=', 'Inv.cId')
  .where('Inv.id', 2)
  .select()
  .then(...)

8
我需要类似的复杂查询,而knex似乎是不可避免的选择。那么为什么还要使用Bookshelf.js作为ORM呢?当使用纯knex查询时,ORM功能(如关联模型(一对一,一对多等))似乎变得无用。 - hadaytullah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接