如何在 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。
这可以通过配置或任何其他方式来避免吗?
最佳答案
这花了我很长时间才弄清楚,但多重查询行为是设计使然的。与连接相比,书架更喜欢多个未连接的往返,但不支持 N+1。每个表查询一次。通过分解查询,如果由于节点的异步特性而有多个连接到单个表,则可以并行运行一些查询。这种权衡对于深层嵌套关系没有意义,但对于具有许多第一代关系的数据模型可能有意义。我从未检查过是否存在任何类型的事务或行锁定。
您可以使用 Knex ( http://knexjs.org/#Builder-join ) 强制连接并将其混合到您的书架代码中,但对于除时间最敏感和优化的应用程序之外的所有应用程序,您可能不会注意到开销,除非数据库的延迟是穷。
如果您正在执行非常复杂的查询,其中需要连接来提高性能,我可能建议仅使用 knex 或 knex.raw 而不是 bookshelf。
关于javascript - Bookshelf.js/Knex.js 嵌套在单个查询中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39401892/