如何使用引用而不是Objection / Knex中的文字字符串值来查询.where()

时间:2017-10-04 23:17:30

标签: javascript sql knex.js objection.js

我正在尝试使用Knex和Objection生成这个postgres SQL:

select *
from "WorkoutEntry" e
where EXISTS (
   select *
   from "WorkoutCategory" c
   INNER JOIN "StandardWorkoutDefinition" d on d."workoutCategoryId" = c.id
   where c.id = 2 and e."standardWorkoutDefinitionId" = d.id
);

我差不多了 - 但StandardWorkoutDefinition.id行始终转换为文字字符串,而不是引用数据库中的正确列。

 return await WorkoutEntry.query()
    .whereExists(
      WorkoutCategory.query()
        .innerJoin(
          'StandardWorkoutDefinition',
          'StandardWorkoutDefinition.workoutCategoryId',
          'WorkoutCategory.id',
        )
        .where('WorkoutCategory.id', workoutCategoryId)
        .where(
          'WorkoutEntry.standardWorkoutDefinitionId',
          'StandardWorkoutDefinition.id',
        ),
    )
    .andWhere({
      deletedAt: null,
      memberId,
    });

如何输出e。“standardWorkoutDefinitionId”来输出以使查询正确?

1 个答案:

答案 0 :(得分:2)

这是ref()的情况。 Where()将始终接受一个值作为第二个比较点; whereRef()将接受引用。

比较两个ID:

    .whereRef(
      'WorkoutEntry.standardWorkoutDefinitionId',
      '=',
      'StandardWorkoutDefinition.id',
    ),

在Objection.js 1.0中,{@ 1}}将被弃用,呼叫将是:

whereRef

非常确定我仍然缺少一种更容易的异议方式来做到这一点,我会在这里寻找和更新。

更新:在Objection.js中这很容易!

.where('WorkoutEntry.standardWorkoutDefinitionId', ref('StandardWorkoutDefinition.id'))