我尝试使用具有各种字段的类型指定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]
}
...
答案 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)
为了这里的任何人的利益,看起来这是不可能的,至少根据阿波罗的开发。