在下面的代码中,我将连接两个表并搜索一个正确的名称:
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
),因为user
和home
表都有name
列。如果我执行一个简单的
where
语句,查询将成功 const homesWithUsers = knex('funeral_homes')
.join('users', 'homes.id', 'users.home_id')
.where({ 'homes.name': payload.home_name })
.select('*');
唯一的问题是,这将失败,因为我希望与数据库交互的用户输入有效负载值。
对如何在联接表上成功执行
whereRaw
有何建议? 最佳答案
向raw传递列标识符时,需要使用标识符替换语法??
,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,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51461746/