Objection.js 查询构建器如何知道何时应该执行链式调用?
How does Objection.js query builders know when a chained call is supposed to be executed?
来自 docs
中的示例
await User.query()
returns 对大量用户的承诺。
await User.query().findById(1)
returns ID为1的用户
User.query()
如何知道何时需要执行它或它是否被链接。
我假设一旦 User.query()
被调用,请求已经传输到数据库服务器,因此无法修改。但是,将其与 .findById(1)
链接会修改请求,以便它构建条件为 User.id = 1;
的查询,然后将其传输到数据库服务器?。它是如何工作的?
User.query()
returns 一个查询生成器,可以在其中添加任意数量的链式方法调用:
query = User.query();
query.where('id', 1);
query.limit(1);
// also each method returns `this` as return value so chaining is possible
query.select('id', 'name').where('name', 'like', '%batman%')
现在查询已完成,您想要执行查询生成器并将查询发送到您需要调用 .then()
的数据库,或者例如使用 Promise.resolve(query)
解析它,这会隐式调用查询生成器的.then
方法。
在您的情况下,您使用 await
来触发查询,这实际上只是 ´Promise.resolve`
的语法糖
以下执行查询的所有示例都非常等效
// await with parenthesis underlining execution order of statements
res = await (User.query().select('name'));
// await without parenthesis with implicit execution order
res = await User.query().select('name');
// older way with thenables and promises
User.query().select('name').then(res => {
})
// another way with themables and promises
Promise.resolve(User.query().select('name')).then(res => {
})
所以上述所有情况都调用查询构建器的 .then
方法来执行查询和 .then
returns 一个承诺,它将根据从数据库读取的结果进行解析。
来自 docs
中的示例await User.query()
returns 对大量用户的承诺。
await User.query().findById(1)
returns ID为1的用户
User.query()
如何知道何时需要执行它或它是否被链接。
我假设一旦 User.query()
被调用,请求已经传输到数据库服务器,因此无法修改。但是,将其与 .findById(1)
链接会修改请求,以便它构建条件为 User.id = 1;
的查询,然后将其传输到数据库服务器?。它是如何工作的?
User.query()
returns 一个查询生成器,可以在其中添加任意数量的链式方法调用:
query = User.query();
query.where('id', 1);
query.limit(1);
// also each method returns `this` as return value so chaining is possible
query.select('id', 'name').where('name', 'like', '%batman%')
现在查询已完成,您想要执行查询生成器并将查询发送到您需要调用 .then()
的数据库,或者例如使用 Promise.resolve(query)
解析它,这会隐式调用查询生成器的.then
方法。
在您的情况下,您使用 await
来触发查询,这实际上只是 ´Promise.resolve`
以下执行查询的所有示例都非常等效
// await with parenthesis underlining execution order of statements
res = await (User.query().select('name'));
// await without parenthesis with implicit execution order
res = await User.query().select('name');
// older way with thenables and promises
User.query().select('name').then(res => {
})
// another way with themables and promises
Promise.resolve(User.query().select('name')).then(res => {
})
所以上述所有情况都调用查询构建器的 .then
方法来执行查询和 .then
returns 一个承诺,它将根据从数据库读取的结果进行解析。