使用Hasura中的GraphQL在两个联接上创建关系(即跳过嵌套关系)



我有一个查询,它解析了;产品";对象。用户有事务,这些事务链接到特定的产品,因此我们按如下方式解析查询,这反映了数据库结构和模式。

假设模式如下:

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
    }
  }
}

最新更新