如何在knex中使用'和'与'on'连接条件

时间:2016-03-14 14:44:14

标签: mysql knex.js

我正在尝试生成一个类似的查询:

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'视为列。 在这种情况下如何应用'和'条件?

3 个答案:

答案 0 :(得分:5)

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作为字符串就可以了。 希望这有助于某人。

答案 1 :(得分:2)

我必须使用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与字符串文字而不是列进行比较。

答案 2 :(得分:1)

文档不足,但是您现在可以使用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')]);