Hasura GraphQL 查询:具有来自相关实体的值的 where 子句

Hasura GraphQL query : where clause with value from related entity

我最近开始通过 PostgreSQL 数据库之上的 Hasura 层使用 GraphQL。我在执行基本查询时遇到问题。

这是我的实体:

文章:

类别:

我想用英语实现的目标如下:获取在创建相关类别后的前 3 天内发布的文章。

在伪SQL中,我会做类似的事情:

SELECT Article.content, Category.name
FROM Article
INNER JOIN Category ON Article.categoryId = Category.categoryId
WHERE Article.publishedDate < Category.createdDate + 3 days

现在作为 GraphQL 查询,我尝试了类似的方法:

query MyQuery {
    articles(where: {publishedDate: {_lt: category.createdDate + 3 days}}) {
        content
        category {
            name
        }
    }
}

不幸的是,它无法识别 where 子句中的“category.createdDate”。我尝试了多种变体,包括别名,但都没有成功。

我错过了什么?

根据我对 Hasura 文档的理解,无法像在 SQL 中那样在查询中引用字段。但这并不意味着,你不能做你想做的事。您可以通过三种方式实现您想要的结果:

1。创建过滤视图

CREATE VIEW earliest_articles AS
SELECT Article.*
FROM Article
INNER JOIN Category ON Article.categoryId = Category.categoryId
WHERE Article.publishedDate < Category.createdDate + 3 days

此视图现在应该可以作为查询使用。 Docs for views are here.

2。使用新字段创建视图

CREATE VIEW articles_with_creation_span AS
SELECT
  Article.*,
  (Article.publishedDate - Category.createdDate) AS since_category_creation
FROM Article
INNER JOIN Category ON Article.categoryId = Category.categoryId

现在您可以再次查询此视图并对额外字段使用过滤器查询。如果您想改变要查询的时间量,此解决方案很有用。缺点是,现在有两种不同的 article 类型,隐藏常规文章查询可能有意义。

3。使用计算字段

您还可以在 Hasura 中定义计算字段。这些字段不仅包含在对应GraphQL类型的输出对象类型中,还可以用于查询。请参阅 the docs 了解如何创建计算域。在这里你可以再次计算差异,然后使用某种比较运算符 (<) 来检查这个时间是否小于 '3 days'