如何使用Knex实现嵌套查询获取指定代理未关联的仓库?
使用Knex.js实现指定代理未关联的仓库查询
嘿,这事儿用Knex其实挺直观的,刚好能完美对应你写的原生SQL逻辑,我给你两种实现方式,你看哪种顺手:
方式一:嵌套子查询写法
直接把子查询嵌套在whereNotIn里,和你的原生SQL结构几乎一一对应:
// 执行查询并获取结果 const unlinkedWarehouses = await knex('warehouses') .select('id', 'name') // 选择需要的字段 .whereNotIn('id', function() { // 这里的this指向Knex查询构造器,用来构建子查询 this.select('warehouse_id') .from('agents_warehouses') .where('agent_id', 2); });
方式二:拆分子查询写法
如果子查询逻辑以后可能变复杂,把它单独抽出来定义,代码可读性会更好:
// 先定义子查询:获取agent_id=2已关联的仓库ID列表 const linkedWarehouseIds = knex('agents_warehouses') .select('warehouse_id') .where('agent_id', 2); // 再用主查询筛选未关联的仓库 const unlinkedWarehouses = await knex('warehouses') .select('id', 'name') .whereNotIn('id', linkedWarehouseIds);
补充说明
- Knex会自动帮你处理表名和字段的转义,不用像原生SQL那样手动加反引号`,它会根据你配置的数据库类型(比如MySQL、PostgreSQL)生成适配的语法。
- 两种写法最终生成的SQL和你给出的原生语句完全一致,执行结果也没有区别,选哪种全看你代码的可读性需求。
内容的提问来源于stack exchange,提问作者Saajidh Borham
相关产品推荐
相关产品推荐

