2017-08-09 102 views
0

我想在GraphQL查詢中指定內部約束,這會限制最外層查詢的結果作爲我正在處理的查詢/謂詞生成器的一部分。我不確定這是否被認爲是在GraphQL的能力範圍內,但對我而言,這是人們想要做的事情。使用GraphQL結構來構建複雜的數據庫查詢

例如,我可能想顯示的博客帖子最近被評論這樣的列表:

{ 
    posts{ 
    title 
    date 
    comments(since: $earliestDate){ 
     body 
     date 
     author { 
     name 
     } 
    } 
    } 
} 

這樣做的正常行爲將帶回的所有博客文章,只評論說,會見標準。

{ 
    "posts": [ 
    { 
     "title": "Post 1", 
     "date": "2017-07-31" 
     "comments": [ 
     ] 
    }, 
    { 
     "title": "Post 2", 
     "date": "2017-06-10", 
     "comments": [ 
     { 
      "body": "Comment text", 
      "date": "2017-08-09", 
      "author": { 
      "name": "Michael" 
      } 
     } 
     ] 
    } 

    ] 
} 

但我想我的查詢,以防止「後1」的檢索,因爲它在過去一個月沒有意見,但我不知道這件事情GraphQL將很容易做到。

GraphQL中是否有支持返回此結果的功能?

{ 
    "posts": [ 
    { 
     "title": "Post 2", 
     "date": "2017-06-10", 
     "comments": [ 
     { 
      "body": "Comment text", 
      "date": "2017-08-09", 
      "author": { 
      "name": "Michael" 
      } 
     } 
     ] 
    } 

    ] 
} 

回答

2

TL; DR - 一般情況下,你想有一個字段的的行爲只定義爲:

  • 傳遞給現場
  • 對象身份的論點正被查詢
  • 查詢的全局上下文(例如,執行查詢的用戶的身份)

我認爲你所追求的行爲對於GraphQL並不是很理想。至少就我所見,GraphQL傾向於將字段視爲相對獨立(即使它們是嵌套的)。

例如,您不希望傳遞給子字段的參數更改其父項的行爲。同樣,我認爲你不會期望存在缺席一個子字段來改變其父母的行爲。

來完成你後的行爲將是一個參數添加到崗位現場,表示只有與評論的帖子應該返回的最好辦法:

{ 
    posts(withCommentsOnly: true) { 
    title 
    date 
    comments(since: $earliestDate) { 
     body 
     date 
     author { 
     name 
     } 
    } 
    } 
} 

要了解原因,只是想想這些種情景模式:

{ 
    authors { 
    id 
    posts { 
     comments { body } 
    } 
    } 
} 

如果該查詢有您所描述的行爲,每個作者,你只會得到posts其中也有comments。但是,假設您稍後再重新查詢其中一個作者:

{ 
    node(id: "author_id") { 
    ... on Author { 
     posts { title } 
    } 
    } 
} 

現在您將獲得一組不同的帖子嗎?這種行爲會讓人們很難用標準的GraphQL客戶端查詢你的GraphQL模式,因爲客戶端緩存機制可能無法正確地更新他們的緩存。

+0

謝謝,這是一個非常明確和詳細的答案。這正是我開始理解的內容,但我仍然想知道是否可以通過某種方式利用GraphQL來支持我的用例。我試圖避免編寫自己的自定義查詢語言,看起來與GraphQL非常接近! –