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' 
    })
  }] });