首页 > 解决方案 > Knex 别名 where

问题描述

我使用 knex 查询我的后端

knex('project AS p')
 .select('p.name as projectName')
 .where('p.name', 'abc')

如果我使用p.name = 'abc',那么代码有效

但是,当我使用时出现错误:

.where(projectName, 'abc') 
.where(p.name, 'abc')
.where({projectName: abc})

我想使用别名来查询不是 p.name 因为当前端发送请求时,tehy 发送 ?projectName='abc' 而不是 'p.name'='abc'。你知道怎么做吗

例子

SELECT 
    cp.id AS cId,
    (CASE WHEN cp.id = 7 THEN 'abc' ELSE 'NOT abc' END) AS abc
FROM customer_project AS cp
;

我如何这样查询

SELECT 
    cp.id AS cId,
    (CASE WHEN cp.id = 7 THEN 'abc' ELSE 'NOT abc' END) AS abc
FROM customer_project AS cp
WHERE abc = 'abc'
;

得到错误列 abc 不存在。但我真的很想查询 abc 列(虽然它没有退出架构但我创建了它)

标签: node.jspostgresqlknex.js

解决方案


用于.toSQL()检查knex您的案例中生成的查询类型。您在帖子中的示例不起作用(甚至存在语法错误),因此我无法确切说明您做错了什么。

但是,这也应该与 knex 一起正常工作:

> const Knex = require('knex');
undefined
> const knex = Knex({
...   client: 'pg',
... });
undefined
> 
> console.log(
... knex('project AS p')
...  .select('p.name as projectName')
...  .where('p.name', 'abc')
...  .where('projectName', 'abc')
...  .toSQL()
... );
{ method: 'select',
  options: {},
  timeout: false,
  cancelOnTimeout: false,
  bindings: [ 'abc', 'abc' ],
  __knexQueryUid: 'c1a458e3-9fc4-4f9b-a206-eee7ecb5b897',
  sql: 'select "p"."name" as "projectName" from "project" as "p" where "p"."name" = ? and "projectName" = ?' }
undefined
> 

对我来说,生成的 SQL 看起来还不错。


推荐阅读