Javascript Bookshelf.js/Knex.js嵌套在单个查询中的位置
如何在Javascript Bookshelf.js/Knex.js嵌套在单个查询中的位置,javascript,orm,bookshelf.js,knex.js,Javascript,Orm,Bookshelf.js,Knex.js,如何在bookshelf.js中组合相关模型的查询 目前,ORM向我想要合并的数据库发出两个单独的查询。来自sequelize,可能是这样的: Model.find({ where: { someField: 'someValue' }, include: [{ model: OtherModel, as: 'otherModel', where: { someOtherField: 'someOtherValue' <--- par
bookshelf.js
中组合相关模型的查询
目前,ORM向我想要合并的数据库发出两个单独的查询。来自sequelize
,可能是这样的:
Model.find({
where: {
someField: 'someValue'
},
include: [{
model: OtherModel,
as: 'otherModel',
where: {
someOtherField: 'someOtherValue' <--- part of the same query
}
}]
})
这是可行的,除了knex.js
调试器显示对数据库执行的两个独立查询之外。我希望bookshelf足够智能,能够构建在单个查询中联接的SQL
这是可以通过配置或任何其他方式避免的吗?我花了很长时间才想清楚,但多重查询行为是经过设计的。Bookshelf支持多个未加入的往返而不是加入,但不支持N+1。它对每个表查询一次。通过分解查询,如果由于节点的异步性质,有多个连接到单个表,则可以并行运行一些查询。这是一种折衷,对于深度嵌套的关系没有意义,但对于具有许多第一代关系的数据模型可能有意义。我从未检查过是否存在任何类型的事务或行锁定 您可以使用Knex()强制加入,并将其混合到您的书架代码中,但是对于除时间最敏感和优化的应用程序以外的所有应用程序,您可能不会注意到开销,除非您对数据库的延迟很差
如果您正在执行非常复杂的查询,其中连接是性能所必需的,我可能建议只使用knex或knex.raw而不是bookshelf 有趣。您是否有任何指向描述此行为的文档的链接?我觉得很奇怪,于是继续续集。
Model
.where({ someField: 'someValue' })
.fetch({ withRelated: [{
otherModel: q => q.where({
someOtherField: 'someOtherValue'
})
}] });