首页 > 解决方案 > Hasura 中的一个计算域,它返回一个整数数组

问题描述

问题

我正在尝试添加返回整数数组的计算字段。Hasura 目前支持 anySETOF <table-name>BASEtype 的返回类型。我尝试返回一个integer[]但它失败了(它不是一个BASE类型)。有解决办法吗?

这是我尝试过的

我有两个表:课程和测验,一个课程有很多测验,每个测验都有一个名为难度的整数字段。我想在课程表中添加一个计算字段,其中列出了相关测验的不同难度。

使用 SQL,我们可以创建一个数组,用这个查询生成这个列表:

SELECT array(SELECT DISTINCT difficulty FROM quizzes
  WHERE course_id = 1 ORDER BY difficulty ASC);

因此,我创建了一个返回此查询结果的函数,并将其作为计算字段添加到课程表中

CREATE OR REPLACE FUNCTION courses_quiz_difficulties(course_row courses)
RETURNS integer[] AS $$
  SELECT array(SELECT DISTINCT difficulty FROM quizzes
  WHERE course_id = course_row.id ORDER BY difficulty ASC);
$$
LANGUAGE SQL STABLE;

当我尝试添加计算域时,出现错误,因为 int 数组不是 BASE 类型。

在表“课程”中:在计算字段“quiz_difficulties”中:计算字段“quiz_difficulties”不能添加到表“课程”中,因为函数“courses_quiz_difficulties”返回类型 _int4 不是 BASE 类型

有没有办法让它与 Hasura 一起工作?

这是相应的文档:

https://hasura.io/docs/1.0/graphql/manual/schema/computed-fields.html#supported-sql-functions

标签: postgresqlhasura

解决方案


一个简单的视图给了我想要的结果:

CREATE VIEW course_quiz_difficulties AS        
    SELECT 
        course_id, 
        array_agg(DISTINCT difficulty ORDER BY difficulty) as quiz_difficulties
    FROM quizzes GROUP BY course_id

之后我们可以手动添加课程和新视图之间的关系: courses . id → course_quiz_difficulties . course_id

Hasura 允许我们从以下位置查询 quiz_difficulties courses

query MyCourseQuizDifficulties {
  courses(limit: 1) {
    id
    quiz_difficulties {
      quiz_difficulties
    }
  }
}

我们得到这个结果:

{
  "data": {
    "courses": [
      {
        "id": 1,
        "quiz_difficulties": {
          "quiz_difficulties": [
            1,
            2
          ]
        }
      }
    ]
  }
}

推荐阅读