javascript - knexjs 和 postgres : whereRaw within a join

标签 javascript database postgresql join knex.js

在下面的代码中,我加入了两个表并搜索了一个专有名称:

const homesWithUsers = knex('homes')
  .join('users', 'homes.id', 'users.home_id')
  .whereRaw(
     `LOWER("homes.name") LIKE ?`,
     '%' + payload.home_name.toLowerCase() + '%'
   )

//Stringified
select * from "homes" inner join "users" on "homes"."id" = "users"."home_id" where LOWER("homes.name") LIKE '%george%'

我需要使用 whereRaw,因为数据库列和搜索词是大写不确定的专有名称。 (存储以全部大写表示的专有名称的额外列不是一种选择。)但是,此查询失败并显示:错误:列“homes.name”不存在。如果我删除 homes. 查询是不明确的(error: column reference "name"is ambiguous),因为 userhome 表有 name 列。

如果我执行一个简单的 where 语句,查询就会成功

  const homesWithUsers = knex('funeral_homes')
    .join('users', 'homes.id', 'users.home_id')
    .where({ 'homes.name': payload.home_name })
    .select('*');

唯一的问题是,这将因我希望从与数据库交互的用户那里获得的有效负载值而失败。

对于如何在联接表上成功执行 whereRaw 有什么建议吗?

最佳答案

在将列标识符传递给 raw 时,您需要使用标识符替换语法 ??,这需要正确引用。像这样:

const homesWithUsers = knex('homes')
  .join('users', 'homes.id', 'users.home_id')
  .whereRaw(
     `LOWER(??) LIKE ?`, ["homes.name", '%' + payload.home_name.toLowerCase() + '%']
   )

关于javascript - knexjs 和 postgres : whereRaw within a join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51461746/

相关文章:

javascript - Big Cartel Javascript API Product.findAll() 不尊重参数

mysql - SQL 比较同一列中的 2 个日期时间

postgresql - 具有多列的 Postgres 全文搜索,为什么在索引中而不是在运行时连接?

postgresql - 从 JavaDB 迁移到 PostgreSQL 并且无法再访问数据库

javascript - 将函数分配给 jQuery 中的单个字母

javascript - 为基本的 CSS Canvas 游戏实现游戏开始/游戏结束/重启步骤

iphone - 为 iPhone 更新 sqlite 数据库

ruby-on-rails - Rails:FATAL - 用户对等身份验证失败(PG::Error)

javascript - 如何从名称中获取 javascript 类

database - 事务空闲 : How to get the query caused