我有一个查询,它解析了;产品";对象。用户有事务,这些事务链接到特定的产品,因此我们按如下方式解析查询,这反映了数据库结构和模式。
假设模式如下:
type User {
id: int
name: string
transactions: [Transaction]
}
type Transaction {
id: int
user_id: int
product_id: int
product_sku: int
amount: number
purchase_date: datetime
user: User
product: Product
}
type Product {
id: int
name: string
transactions: [Transactions]
}
那么解决购买产品的查询将是:
query purchased_products {
user {
transactions {
product {
id
}
}
}
}
我想简化前端的查询,因为他们不需要了解交易。他们想回答";每个用户都拥有什么产品&";。我想向User添加一些可以直接回答这个问题的关系或查询,将User模式扩展为包括:
type User {
id: int
name: string
transactions: [Transaction]
products_owned: [Product]
}
query purchased_products_simple {
user {
products_owned {
id
}
}
}
我希望在不使用外部远程模式或解析器的情况下完成此操作。
我该怎么做?我这样做是否打破了graphql的任何假设?
谢谢!
使用Hasura实现这一点的最佳方法是创建一个视图或一个计算函数,以向API的消费者隐藏这种复杂性/实现细节。
例如:
CREATE VIEW user_products AS SELECT u.id, p.* FROM users u
JOIN transactions t ON t.user_id = u.id
JOIN products p ON t.product_id = p.id
创建视图后,您可以在Hasura中跟踪它,然后通过链接user_id
手动加入users
表和新视图之间的关系
然后你就可以这样查询了:
query {
user {
id
name
products {
name
}
}
}