Objection.js的relationMapping中如何对同字段筛选两个不同值
失效原因
- 第一种写法
field1: [null, 0]生成的SQL为field1 IN (null, 0),SQL语法中NULL不能通过IN运算符匹配,NULL和任何值的等值比较结果都为unknown,因此匹配不到值为NULL的记录。 - 第二种写法同一个键
field1重复定义,JS对象的同名键会被后定义的内容覆盖,最终过滤规则只保留field1: [0],自然无法匹配NULL。
正确实现方式
Objection.js的关联过滤filter属性支持传入回调函数接收查询构建器,你可以手动组合or条件实现需求,示例如下:
static get relationMappings() { return { dipendenti: { relation: Model.ManyToManyRelation, modelClass: path.join(__dirname, '/DestModel'), // 替换原来的对象形式filter为函数形式 filter: (query) => { query.where((subQuery) => { // 匹配field1为0 或者 field1为NULL的记录 subQuery.where('field1', 0).orWhereNull('field1') }) }, join: { from: `fromField`, through: { modelClass: path.join(__dirname, '/ThroughModel'), from: `throughFromField`, to: `throughToField` }, to: `toField` } } }; }
注意事项
- 如果
field1是中间表(ThroughModel)的字段,需要在字段前加上中间表的表名前缀,避免和目标表、源表的同名字段冲突,示例:subQuery.where('through_table.field1', 0).orWhereNull('through_table.field1') - 外层嵌套
where是为了避免过滤条件和关联本身的join条件逻辑冲突,确保两个field1的判断是作为一个整体的or条件生效。
内容的提问来源于stack exchange,提问作者AlTheLazyMonkey
相关产品推荐
相关产品推荐

