首页 > 解决方案 > 如何将 AND 和 OR 与 Knex 结合?

问题描述

我无法在 Knex 中创建以下 SQL 查询:

SELECT * FROM tasks WHERE (code = 'export') AND (status = 'failed' OR status = 'complete')

使用代码:

const queryResult = await this.db('tasks')
        .select('*')
        .where(async function () {

          if ('code' in query) {
            this.where('code', query.code)
          }

          if ('status' in query) {
            if (isArray(query.status)) {
              return query.status.map(status => this.orWhere('status', status))
            } else {
              this.andWhere('status', query.status)
            }
          }
        })
        .orderBy('created_at', 'DESC')

当提供多个状态的数组时,它会忽略“code = export”值并选择所有内容。

标签: javascripttypescriptknex.js

解决方案


const query = knex('tasks');

if ('code' in query) {
  query.where('code', query.code);
}

if ('status' in query) {
  query.where(builder => {
    const statuses = isArray(query.status) ? query.status : [query.status];
    for (let status of statuses) {
      builder.orWhere('status', status);
    }
  });
}

const result = await query;


推荐阅读