typescript - 使用 knex.js 和 TypeScript 构建基于条件的查询
问题描述
我想构建一个查询,根据是否传递了名称和/或城市,它应该添加一个where子句。
我在文档中没有找到执行此操作的特定方法,因此我尝试在查询中附加where方法,但可能无法指定类型。
let query: Knex.QueryBuilder = await knex<Member>('members')
if (name) {
query = query.where('name', String(name))
}
if (city) {
query = query.where('city', String(city))
}
const members: Member[] = query.select('*')
TypeError: query.select is not a function
此外,TypeScript 警告:
让查询
Type 'Member[]' is missing the following properties from type 'QueryBuilder<any, any>': client, or, not, and, and 118 more.
常量成员
Type 'QueryBuilder<any, DeferredKeySelection<any, string, false, {}, false, {}, never> | DeferredKeySelection<any, string, false, {}, false, {}, never>[]>' is missing the following properties from type 'Member[]': length, pop, push, concat, and 25 more.
解决方案
Knex.js 有一个伪造的then
实现,它在调用时会在数据库上执行查询。
因此,您只需将await
(然后调用)移动到最后一部分。
它应该如下所示:
let query: Knex.QueryBuilder = knex<Member>('members');
// ---------------------------^
if (name) {
query = query.where('name', String(name));
}
if (city) {
query = query.where('city', String(city));
}
const members: Member[] = await query.select('*');
一个更好看的结构将使用modify
.
const members: Member[] = await knex<Member>('members')
.select('*')
.modify((queryBuilder) => {
if (name) {
queryBuilder.where('name', String(name));
}
if (city) {
queryBuilder.where('city', String(city));
}
return queryBuilder;
});
推荐阅读
- outlook - Outlook 插件对话框浏览器
- vb.net - 有没有办法将数学字母数字符号(unicode 中的符号)保存到 VB.NET 中的 PDF 或 Word 文档中?
- matlab - 在 MATLAB 中使用 UV 映射
- r - 如何使用调查来分析使用复制权重的美国住房调查数据
- java - 子对象的父引用( parent obj = new child() )
- c# - 在asp.net core 2.2 web api中的AuthenticationHandler中获取控制器名称
- matplotlib - 在一组点上绘制曲线显示两条不同的曲线?
- javascript - 在 .attrs 方法中获取 d3 中文本节点的宽度
- sql - Teradata - 调用名称中带有空格的表
- spacy - spacy/sense2vec 中的 most_similar 方法打印所有内容