【问题标题】:Hasura GraphQL query : where clause with value from related entityHasura GraphQL 查询:带有来自相关实体的值的 where 子句
【发布时间】:2021-10-30 20:34:22
【问题描述】:

我最近开始通过 PostgreSQL 数据库之上的 Hasura 层使用 GraphQL。我在实现基本查询时遇到了麻烦。

这是我的实体:

文章:

  • 文章编号
  • 内容
  • 发布日期
  • 类别 ID

类别:

  • 类别 ID
  • 姓名
  • 创建日期

我想用英语实现以下目标:获取在创建相关类别后的前 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”。我尝试了多种变体,包括别名,但均未成功。

我错过了什么?

【问题讨论】:

  • 我认为您不能在查询中引用其他字段。我认为您必须创建一个视图,您可以在其中首先过滤您想要的行您可以简单地选择差异作为一行,然后查询该字段。

标签: sql postgresql graphql hasura


【解决方案1】:

就我对 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。在这里您可以再次计算差异,然后使用某种比较运算符 (&lt;) 来检查此时间是否小于 '3 days'

【讨论】:

  • 非常感谢您的回答,非常清楚且解释清楚。我希望有一个纯粹的 GraphQL 解决方案,但似乎使用 Hasura 设置是不可能的。再次感谢。
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多