Bookshelf.js / Knex.js嵌套在单个查询中
Bookshelf.js / Knex.js nested where in single query
如何在bookshelf.js
中合并相关模型的查询?
目前,ORM向我想要合并的数据库发出两个单独的查询。来自sequelize
,可能是这样的:
Model.find({
where: {
someField: 'someValue'
},
include: [{
model: OtherModel,
as: 'otherModel',
where: {
someOtherField: 'someOtherValue' <--- part of the same query
}
}]
})
我在bookshelf.js
中的当前设置(设置了Model
和OtherModel
之间的关系):
Model
.where({ someField: 'someValue' })
.fetch({ withRelated: [{
otherModel: q => q.where({
someOtherField: 'someOtherValue'
})
}] });
这个工作,除了knex.js
调试器显示对数据库执行两个单独的查询。我希望bookshelf足够聪明,可以构建SQL连接单个查询。
这是可以通过配置或其他方式避免的吗?
我花了很长时间才明白,但多重查询行为是设计好的。Bookshelf倾向于多次非连接往返,而不是连接,但不是N+1。它对每个表查询一次。通过分解查询,如果由于节点的异步特性,有多个连接到单个表,则可以并行运行一些查询。这种权衡对于深度嵌套关系来说没有意义,但对于具有许多第一代关系的数据模型来说可能有意义。我从来没有检查过是否有任何类型的事务或行锁定。
您可以使用Knex (http://knexjs.org/#Builder-join)强制连接,并将其混合到您的书架代码中,但是除了对时间最敏感和优化的应用程序之外,您可能不会注意到开销,除非您对DB的延迟很差。
如果你正在做非常复杂的查询,其中连接需要性能,我可能建议只使用knex或knex。原始的而不是书架。
相关文章:
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- 引用单个表的多列 - Sails JS API 模型
- 如何从ng重复单个范围更改父范围 - Angular JS
- 可以't在Angular js/HTML中获取单个记录
- 使用sammy.js和Knockout.js来显示url中的单个项
- 如何根据JavaScript Node.js中的单个值动态拆分数组
- 需要来自单个JS文件的多个子模块与节点/组件.js
- 如何在角度js中以单个形式创建多个组输入类型
- 扩展验证.js并验证单个元素
- Vue.js:如何在单个文件组件中指定道具
- 如何根据URL参数生成包含JS内容的单个HTML文件
- Dropzone.js-上传文件夹结构和单个文件
- 为什么可以't我在highstocks.js中的蜡烛图中获得超过55个条形的单个条形颜色
- 在单个文件中需要js和多个已编译的Handlebar.js模板
- Ember.js中单个资源中的多个动态段
- 有没有一种方法可以保存单个图像,并防止用户使用dropzone.js放置多个图像
- 多个放置区.js - 单个页面
- 主干.js单个集合项视图
- 定义JQuery变量的作用域,不同的js-单个页面
- Parsley.js单个复选框未被验证