如何在 knex 中使用 'and' 和 'on' 连接条件
How to use 'and' with 'on' condition of joins in knex
我正在尝试生成如下查询:
select ifnull(t1.name, ‘default’) as name
from tab1 as t1
left join tab2 as t2
on t1.id=t2.id and t2.code=“someValue”
我在 knex 中写了这个:
var query = knex().from(’tab1’).join(’tab2', function() {
this.on('tab1.id', '=', 'tab2.id').andOn('tab2.code', '=', 'someValue')
},
‘left')
.column([
knex.raw(‘IFNULL(tab1.name, "no name") as name')
]);
这不会执行,因为它将 'someValue' 视为一列。
在这种情况下如何应用 'and' 条件?
var query = knex().from('tab1').join('tab2', function() {
this.on('tab1.id', '=', 'tab2.id')
.on('tab2.code', '=', knex.raw('?', ['someValue']))
}, 'left')
.column([knex.raw('IFNULL(tab1.name, "no name") as name')]);
使用 knex.raw 将 someValue 引用为字符串就可以了。
希望这对某人有所帮助。
我不得不使用 knex.raw('?', ['someValue'])
而不是 knex.raw('someValue')
。
对我来说(使用 Knex 0.13.0)接受的解决方案
.on('tab2.code', '=', knex.raw('someValue')
产生了查询:
tab2.code = someValue
(不带引号)
然后导致 Unknown column someValue
错误。
使用 .on('tab2.code', '=', knex.raw('?', ['someValue']))
生成预期的 tab2.code = 'someValue'
( 带引号 )将 tab2.code
与字符串文字而不是列进行比较。
记录不详,但您现在可以使用 onVal
及其任何和/或变体。
所以,而不是
.on('tab2.code', '=', knex.raw('?', ['someValue']))
你可以简单地写:
const query = knex()
.from('tab1')
.join('tab2', function() {
this.on('tab1.id', '=', 'tab2.id')
this.andOnVal('tab2.code', '=', 'someValue')
}, 'left')
.column([knex.raw('IFNULL(tab1.name, "no name") as name')]);
我正在尝试生成如下查询:
select ifnull(t1.name, ‘default’) as name
from tab1 as t1
left join tab2 as t2
on t1.id=t2.id and t2.code=“someValue”
我在 knex 中写了这个:
var query = knex().from(’tab1’).join(’tab2', function() {
this.on('tab1.id', '=', 'tab2.id').andOn('tab2.code', '=', 'someValue')
},
‘left')
.column([
knex.raw(‘IFNULL(tab1.name, "no name") as name')
]);
这不会执行,因为它将 'someValue' 视为一列。 在这种情况下如何应用 'and' 条件?
var query = knex().from('tab1').join('tab2', function() {
this.on('tab1.id', '=', 'tab2.id')
.on('tab2.code', '=', knex.raw('?', ['someValue']))
}, 'left')
.column([knex.raw('IFNULL(tab1.name, "no name") as name')]);
使用 knex.raw 将 someValue 引用为字符串就可以了。 希望这对某人有所帮助。
我不得不使用 knex.raw('?', ['someValue'])
而不是 knex.raw('someValue')
。
对我来说(使用 Knex 0.13.0)接受的解决方案
.on('tab2.code', '=', knex.raw('someValue')
产生了查询:
tab2.code = someValue
(不带引号)
然后导致 Unknown column someValue
错误。
使用 .on('tab2.code', '=', knex.raw('?', ['someValue']))
生成预期的 tab2.code = 'someValue'
( 带引号 )将 tab2.code
与字符串文字而不是列进行比较。
记录不详,但您现在可以使用 onVal
及其任何和/或变体。
所以,而不是
.on('tab2.code', '=', knex.raw('?', ['someValue']))
你可以简单地写:
const query = knex()
.from('tab1')
.join('tab2', function() {
this.on('tab1.id', '=', 'tab2.id')
this.andOnVal('tab2.code', '=', 'someValue')
}, 'left')
.column([knex.raw('IFNULL(tab1.name, "no name") as name')]);