Objection.js除knex外是否有LeftJoin、RightJoin方法及joinEager区别
Objection.js关联查询问题解答
1. Objection.js的左/右连接实现
Objection.js已经内置了左连接、右连接相关方法,无需单独调用原始Knex查询构建器,常用实现方式有两种:
直接调用通用join方法
用法和Knex原生join语法完全一致,手动指定关联表和连接条件:
// 示例:左连接查询RoleDescription与关联Features数据 const result = await RoleDescription .query() .leftJoin('Features', 'Features.Id', 'RoleDescription.FeatureId') .select('Features.*', 'RoleDescription.id as roleDescId') // 重名字段手动指定别名
右连接仅需把方法名替换为rightJoin即可,参数规则完全相同。
基于已定义关联的joinRelated方法
不需要手动写连接条件,直接使用你在relationMappings里定义的关联名即可,更符合ORM使用习惯:
const result = await RoleDescription .query() .leftJoinRelated('featureRelation') // 直接用定义好的关联名 .select('featureRelation.*', 'RoleDescription.*')
2. joinEager与普通Join的核心区别
- 返回结构不同:普通Join返回的是扁平结构的对象,关联表字段和主表字段平级展示,重名字段会互相覆盖需要手动起别名;
joinEager会按照你定义的关联关系返回嵌套结构,关联表数据会自动放到对应关联属性下(比如示例中会生成featureRelation字段存储关联的Features对象),无需处理别名冲突。 - 默认连接类型不同:你的猜测正确,
joinEager默认使用INNER JOIN实现,所以如果没有匹配的关联数据,主表记录也会被过滤,这就是你无法拿到全量Features数据的原因。如果要让joinEager使用左连接,可以通过配置参数修改:const result = await RoleDescription .query() .joinEager('featureRelation', { joinOperation: 'leftJoin' // 指定使用左连接 }) - 适用场景不同:普通Join适合仅需要少量关联字段、不需要嵌套结构的简单查询;
joinEager适合需要保留ORM嵌套结构、同时需要对关联表做筛选、排序的场景,相比分两次查询的默认eager加载性能更高。
小提示:如果你的核心需求是获取全量Features数据(不管有没有对应RoleDescription记录),建议将查询主表切换为Features,先在Features模型中定义和RoleDescription的一对多关联,再用左连接查询即可更方便实现需求。
内容的提问来源于stack exchange,提问作者khetesh rotangen
相关产品推荐
相关产品推荐

