Knex:如何在 knex 中的有子句中编写 ARRAY_AGG?
Posted
技术标签:
【中文标题】Knex:如何在 knex 中的有子句中编写 ARRAY_AGG?【英文标题】:Knex: How to write ARRAY_AGG in having clause in knex? 【发布时间】:2019-12-03 17:50:04 【问题描述】:我想在knex
中写这个查询。
查询强制从students_subject
(students
和subjects
的联合表)中获取所有这些科目 ID ['123', '456', '789']
注册的学生 ID。
PSQL:
select student_id from students_subject
group by id
having ARRAY_AGG(subject_id) @> array[
'123'::uuid,
'456'::uuid,
'789'::uuid
];
我在knex
中尝试过类似这样的操作,其中subject_ids
是array
的subject ids
。 queryBuilder
是传递给此函数的 knex
实例,该实例将被返回。
Javascript 函数:(返回 knex 查询)
const knex = require('../../../db/knex');
const getSudents = function( queryBuilder, subject_ids)
return queryBuilder.innerJoin('students_subject',
'students_subject.student_id',
'students.id')
.groupBy('students_subject.student_id')
.having(knex.raw('ARRAY_AGG(students_subject.subject_id) @> UNNEST(ARRAY[?]::uuid[])', [subject_ids]));
module.exports = getSudents;
传递的queryBuilder
后面有其他逻辑,我不允许修改。我的工作是构建query
以获取学生ids
并通过。
我得到的错误是:
错误:HAVING 中不允许设置返回函数
你能帮我写出正确的knex
查询吗?
【问题讨论】:
【参考方案1】:由于各种原因,Knex 无法知道如何将 javascript 数组展平为查询。所以你需要手动将其展平:
...UNNEST(ARRAY[$subject_ids.map(() => '?').join(',')]::uuid[])`, subject_ids));
【讨论】:
以上是关于Knex:如何在 knex 中的有子句中编写 ARRAY_AGG?的主要内容,如果未能解决你的问题,请参考以下文章
Knex.js:加入 'select' 和 'where' 子句
如何获取从 Knex 返回的值(数组中的对象,即数组中的对象)