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'
。
我最近开始通过 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'
。