使用GraphQL搜索关系

时间:2017-09-19 19:51:55

标签: node.js graphql graphql-js

我正在尝试使用Node,Sequelize和mySQL建立一个GraphQL服务器。我以前在REST API上做过一些工作但是对GraphQL不熟悉,因此经验有限,并担心意外采用不良做法。

我有三张桌子:events,event_days和参与者。活动有很多天,活动也有很多与会者。我已经设置了架构,以便我可以查询并获取事件列表及其相关日期和与会者。例如:

{
  events {
    name,
    venue,
    attendees {
      name
    }
    days {
      date,
      start_time
    }
  }
}

我还可以在'events'行添加'id'参数来返回特定事件。一切都很简单。我希望能够做的是运行查询以查找某一天的所有事件或由名为“John”等的人参加。如果我在'days'字段名称之后添加参数(如下面的示例所示) )或'参与者'字段名称然后查询失败,说这些不是接受的参数。在某些方面,这似乎是最合乎逻辑的,因为它是在关系上附加参数而不是根查询,但它反复失败,尽管我尝试了各种不同的方式,所以我想知道参数是否只应该附加到'events'行查询和其他字段名称是JUST什么是要返回?这甚至是将这些参数用于良好实践(甚至可能)的“正确”位置吗?试图像这样实现它的部分原因是我想知道Sequelize(或某些中间件)是否可以解释查询附加到哪个字段,然后根据该字段构建查询。

{
  events {
    name,
    venue,
    attendees {
      name
    }
    days ( date: ’2017-07-24' ) {
      date,
      start_time
    }
  }
}

我提出了两种选择,但我不确定哪种方法是正确的做法。当我创建REST API时,我发现了许多良好实践指南,但这些似乎不适用于GraphQL。

备选方法1 :设置几个可用参数(id,date,attendee等),这些参数不一定会查询事件表本身,但也会查询其中一个相关表,然后解释这些参数参数并在服务器端构建查询。这似乎是一种很好的方法,但如果我需要根据传递的参数设置完全不同的搜索,它可能会很快失控。

{
  events ( date: ’2017-07-24' ) {
    name,
    venue,
    attendees {
      name
    }
    days {
      date,
      start_time
    }
  }
}

备选方法2 :在专门设计用于对该关系进行搜索的事件下进行子查询

{
  events {
    searchByDate (date: ‘2017-07-24') {
      name,
      venue,
      attendees {
        name
      }
      days {
        date,
        start_time
      }
    }
    findAll {
      ...
    }
  }
}

0 个答案:

没有答案