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_subjectstudentssubjects 的联合表)中获取所有这些科目 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_idsarraysubject idsqueryBuilder 是传递给此函数的 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 子查询对第二个表中的数据求和

如何获取从 Knex 返回的值(数组中的对象,即数组中的对象)

如何更改 knex 中的总和值

带有 Express 的 Knex.js,如何在 knex.commit 后跟 knex.select 查询?

Bookshelf.js / Knex.js 嵌套在单个查询中的位置