1. ヘルプ
  2. 機能
  3. コンテンツAPI(WRITE)

PATCH APIで繰り返しフィールド内の特定のフィールドを更新する際は、どうすれば良いですか?

→ 繰り返しフィールド内のフィールドを更新する場合は、繰り返しフィールド内のすべてのフィールドを指定する必要があります。

指定方法

例えば、以下のようなコンテンツで繰り返しフィールド内(products)の1つ目のtitleのみ更新する場合を考えます。

{
"title": "タイトル",
"body": "<p>本文が入ります。</p>",
"products": [
{
"fieldId": "product",
"title": "更新前の商品Aの名前",
"body": "<p>商品Aの説明が入ります。</p>"
},
{
"fieldId": "product",
"title": "更新前の商品Bの名前",
"body": "<p>商品Bの説明が入ります。</p>"
}
]
}

1つ目のtitleのみを更新する際のリクエストボディ

繰り返しフィールド内の特定のフィールドのみを更新する場合でも、すべてのフィールドを指定する必要があります。

{
 "products": [
        {
            "fieldId": "product",
        "title": "更新後の商品Aの名前",
            "body": "<p>商品Aの説明が入ります。</p>"
        },
        {
            "fieldId": "product",
          "title": "更新前の商品Bの名前",
            "body": "<p>商品Bの説明が入ります。</p>"
        }
    ]
}

実装例

以下のコードは、コンテンツデータを取得した後、更新対象のデータのみを上書きすることで、全てのフィールドのデータを含んだオブジェクトを生成し、特定のフィールドのデータ更新を行なっています。

  const prevContent = await client.getListDetail({
  endpoint: "endpoint",
  contentId: "contentId",
  queries: {
      fields: "id,products",
  },
});
  
  const indexToUpdate = 0; 
  const newTitle = "更新後の商品Aの名前";
  
  const updatedProducts = prevContent.products.map((product, index) => {
    if (index === indexToUpdate) {
      return {
        ...product, 
        title: newTitle 
      };
    }
    return product; 
  });
  
  await client.update({
  endpoint:"endpoint",
    contentId: prevContent.id,
    content: {
      products: updatedProducts
    }
  });

更新後のコンテンツ

他のフィールドの値を保ったまま、繰り返しフィールド内(products)の1つ目のtitleのみ更新されます。

{
"title": "タイトル",
"body": "<p>本文が入ります。</p>",
"products": [
{
"fieldId": "product",
"title": "更新後の商品Aの名前",
"body": "<p>商品Aの説明が入ります。</p>"
},
{
"fieldId": "product",
"title": "更新前の商品Bの名前",
"body": "<p>商品Bの説明が入ります。</p>"
}
]
}

特定のフィールドのみ指定して更新をすると、指定していないフィールドには空値が入ります。