我正在尝试使用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”来输出以使查询正确?
答案 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'))