knexjs和postgres:联接中的whereRaw

时间:2018-07-22 03:19:36

标签: 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,因为数据库列和搜索词是大写字母不确定的专有名称。 (存储用大写字母表示的专有名称的额外列不是一种选择。)但是,此查询失败,并显示:error: column "homes.name" does not exist。如果我删除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的任何建议?

1 个答案:

答案 0 :(得分:0)

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

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