GraphQL - 传播输入参数

时间:2017-10-02 22:56:38

标签: javascript graphql apollo

我尝试使用具有各种字段的类型指定GraphQL架构,并且还允许您使用相同的参数递归地添加OR: [...]。我已经让它像这样工作了

input BookFilters {
  _id: String
  title: String
  title_contains: String
  title_startsWith: String
  title_endsWith: String
  OR: [BookFilters]
}

type Query {
   allBooks(_id: String
     title: String
     title_contains: String
     title_startsWith: String
     title_endsWith: String
     OR: [BookFilters]
   ): [Book]
}

效果很好,这个查询

{
  allBooks(title_endsWith: "1", OR: [{ title: "2" }, {title:"3"}, {OR: [{title_contains: "Q"}, {OR:[{title:"Q"}]}]}]) {
    _id
    title
  }
}

通过就好了。

我的问题是,有没有办法删除重复?理想情况下,如果

,我会喜欢它
type Query {
   allBooks(...BookFilters): [Book]
}

有效,但似乎没有。

编辑 - 评论带来了碎片。它们只能声明 off 一种类型,对吧?所以我仍然有一个新的类型,列出我的所有查询参数,然后从中创建一个片段,重新列出所有字段?

即使事实并非如此,GraphQL似乎仍然不喜欢传播输入参数。

fragment BookFiltersFragment on BookFilters {
    _id
}

type Query {
   allBooks(...BookFiltersFragment): [Book]
}

...

上的错误

3 个答案:

答案 0 :(得分:0)

我们从普通的JS而不是查询语言构建我们的模式,并且能够使用扩展,因为我们的参数是普通的-javascript-objects。我相信" GraphQLInputType"是一个完全成熟的实例,不容易传播。

答案 1 :(得分:0)

我不明白你希望片段传播作为参数做什么,所以我不能对此发表评论。如果它应该是一个休息参数,我认为最好避免重复:

class AddCompletedAtToFollowUps < ActiveRecord::Migration[5.1]
  def change
    add_column :follow_ups, :completed_at, :datetime

    set_all_but_most_recent_follow_ups_as_long_completed_for_each_account
  end

  private

  def set_all_but_most_recent_follow_ups_as_long_completed_for_each_account
    Account.all.find_each do |account|
      follow_ups = account.follow_ups
      count = follow_ups.count

      next unless count > 1

      follow_ups.order(created_at: :asc).limit(count - 1).
        update_all(completed_at: Time.utc(1900))
    end
  end
end

然后你可以这样做:

input BookFilter {
  _id: String
  title: String
  title_contains: String
  title_startsWith: String
  title_endsWith: String
  OR: [BookFilter]
  AND: [BookFilter]
}

type Query {
   bookSearch(filter: BookFilter): [Book]
}

{ allBooks({ AND: [ {title_endsWith: "1"} {OR: [ {title_startsWith:"2"}, {title_startsWith:"3"} ]} ]} { _id title } } AND的选项可以让您创建逻辑树。上面的查询将匹配21和31,但不匹配22或41。

答案 2 :(得分:0)

为了这里的任何人的利益,看起来这是不可能的,至少根据阿波罗的开发。

https://twitter.com/stubailo/status/914997054098759680

https://twitter.com/stubailo/status/914997127356366848