Objection.js中如何为关联查询的JOIN添加额外过滤条件
解决方案
你可以使用Objection.js内置的modifyGraph方法针对关联查询添加条件,该方法添加的过滤规则会自动写入对应LEFT JOIN的ON子句中,修改后的代码如下:
return Account.query() .alias('accounts') .whereIn('accounts.ID', accountIds) .where('accounts.DELETE_FLAG', 'N') .where('accounts.ISDELETED', false) .withGraphJoined('contacts') // 针对contacts关联添加ON子句过滤条件 .modifyGraph('contacts', query => { query.where('DELETE_FLAG', 'N') .where('ISDELETED', false) }) .execute();
原理解释
你之前直接在withGraphJoined后链式调用where方法,条件会被追加到全局WHERE子句中,会直接过滤掉没有匹配有效contacts的账户记录,违背LEFT JOIN的语义。modifyGraph是专门用于修改嵌套关联查询的API,对于withGraphJoined的关联,它添加的所有条件都会被放到对应JOIN的ON子句内,完全符合你的需求。
可选优化方案
如果这个contacts的软删除过滤是常用逻辑,你可以直接在Account模型的关联定义中添加默认修饰符,后续所有关联查询都会自动带上这两个过滤条件,不用每次手动写:
class Account extends Model { static get relationMappings() { return { contacts: { relation: Model.HasManyRelation, modelClass: Contact, join: { from: 'accounts.ID', to: 'contacts.ACCOUNTID' }, // 关联默认修饰符,条件自动加入JOIN ON子句 modify: q => q.where('DELETE_FLAG', 'N').where('ISDELETED', false) } }; } }
配置后你的查询代码可以简化为:
return Account.query() .alias('accounts') .whereIn('accounts.ID', accountIds) .where('accounts.DELETE_FLAG', 'N') .where('accounts.ISDELETED', false) .withGraphJoined('contacts') .execute();
内容的提问来源于stack exchange,提问作者Chad
相关产品推荐
相关产品推荐

