带连接的 Knex 查询 - 适用于 .where 但不适用于 .whereRaw
Knex query with join - works with .where but not with .whereRaw
我正在使用 knex 和 objection.js 来处理我的 postgres 数据库。我有这个查询涉及三个不同的 tables 和不同的可能过滤器。
我遇到的问题是,当我使用 .whereRaw 进行左连接和查询时,出现以下错误:
错误:缺少 table "publication" 的 FROM 子句条目
如果我改用 .where,它就可以工作。但是我需要 whereRaw 来使过滤器不区分大小写。
Reader.query(Reader.knex())
.where('Reader.id', '=', readerId)
.eager('[tags, publications.[tags, attributions]]')
.modifyEager('publications', builder => {
if (filter.title) {
const title = filter.title.toLowerCase()
builder.where('Publication.name', 'like', `%${title}%`)
// builder.whereRaw(
// 'LOWER(name) LIKE ?',
// '%' + filter.title.toLowerCase() + '%'
// )
}
if (filter.attribution || filter.author) {
builder.leftJoin(
'Attribution',
'Attribution.publicationId',
'=',
'Publication.id'
)
}
if (filter.author) {
builder
.where('Attribution.normalizedName', '=', author)
.andWhere('Attribution.role', '=', 'author')
}
if (filter.attribution) {
builder.where(
'Attribution.normalizedName',
'like',
`%${attribution}%`
)
if (filter.role) {
builder.andWhere('Attribution.role', '=', filter.role)
}
}
orderBuilder(builder)
builder.limit(limit)
builder.offset(offset)
})
注释掉的 .whereRaw 查询是我想要执行的查询。
.where 和 .whereRaw 之间有什么不同会导致一个工作而不是另一个工作?
我不确定为什么 whereRaw
不起作用,必须进行一些调试才能找出答案,但您可以使用 ilike
进行不区分大小写的搜索 where
示例:
builder.where('Publication.name', 'ilike', `%${title}%`)
我正在使用 knex 和 objection.js 来处理我的 postgres 数据库。我有这个查询涉及三个不同的 tables 和不同的可能过滤器。 我遇到的问题是,当我使用 .whereRaw 进行左连接和查询时,出现以下错误: 错误:缺少 table "publication" 的 FROM 子句条目 如果我改用 .where,它就可以工作。但是我需要 whereRaw 来使过滤器不区分大小写。
Reader.query(Reader.knex())
.where('Reader.id', '=', readerId)
.eager('[tags, publications.[tags, attributions]]')
.modifyEager('publications', builder => {
if (filter.title) {
const title = filter.title.toLowerCase()
builder.where('Publication.name', 'like', `%${title}%`)
// builder.whereRaw(
// 'LOWER(name) LIKE ?',
// '%' + filter.title.toLowerCase() + '%'
// )
}
if (filter.attribution || filter.author) {
builder.leftJoin(
'Attribution',
'Attribution.publicationId',
'=',
'Publication.id'
)
}
if (filter.author) {
builder
.where('Attribution.normalizedName', '=', author)
.andWhere('Attribution.role', '=', 'author')
}
if (filter.attribution) {
builder.where(
'Attribution.normalizedName',
'like',
`%${attribution}%`
)
if (filter.role) {
builder.andWhere('Attribution.role', '=', filter.role)
}
}
orderBuilder(builder)
builder.limit(limit)
builder.offset(offset)
})
注释掉的 .whereRaw 查询是我想要执行的查询。 .where 和 .whereRaw 之间有什么不同会导致一个工作而不是另一个工作?
我不确定为什么 whereRaw
不起作用,必须进行一些调试才能找出答案,但您可以使用 ilike
进行不区分大小写的搜索 where
示例:
builder.where('Publication.name', 'ilike', `%${title}%`)