Objection ORM如何选取WITH子句定义的别名且不自动拼接schema前缀?
可行解决方法如下
方法1:使用ref工具函数包裹别名
Objection 提供的ref函数用于生成自定义标识符引用,不会被自动拼接schema前缀,是最推荐的方案:
const { ref } = require('objection'); Model.query() .with(alias, query) .select(columns) .from(ref(alias));
方法2:临时清空当前查询的schema配置
调用withSchema(null)可以临时覆盖Model绑定的schema配置,让整个查询不会自动拼接前缀:
Model.query() .withSchema(null) .with(alias, query) .select(columns) .from(alias);
注意:如果WITH子句内部的查询用到了其他需要带schema的表,需要手动给这些表补全schema前缀
方法3:直接使用底层Knex实例构建查询
如果不需要用到当前Model的ORM特性,直接用Knex实例构建查询不会触发自动加schema的逻辑:
knex.with(alias, query) .select(columns) .from(alias);
问题原因说明
该报错是因为绑定了schema的Model发起查询时,Objection默认会给所有查询中识别到的表标识符自动拼接配置的schema前缀,WITH子句定义的别名会被误判为普通表名,因此被加上了不存在的schema前缀。之前直接用raw(alias)无效是因为未明确告知ORM该标识符不需要额外前缀处理,改用参数绑定形式的raw写法也可以生效:from(raw('??', alias))。
内容的提问来源于stack exchange,提问作者Marcus Ruddick
相关产品推荐
相关产品推荐

