🍉
AWS Amplify @hasMany 子オブジェクトまで一括で削除できない
前提
Amplifyの@hasManyリレーションを使用することで、親のオブジェクトを削除した際に、子オブジェクトも一緒に削除してくれるという仕様があるそうです。
↓ 公式サイトに以下のような記載がありました。
When you delete a parent object in a one-to-many relationship, the children will also be removed from the DataStore and mutations for this deletion will be synced to cloud. For example, the following operation would remove the Post with id 123 as well as any related comments:
一対多のリレーションを構築した際、親オブジェクトのデータを削除した際に、子オブジェクトのデータが削除され、データソースと同期されます。
問題
実際に以下の構成で試したところ、親オブジェクトのデータを削除した際に、子オブジェクトが残ったままになっていました。
schema.grapql
type Blog @model {
id: ID!
content: String
comments: [Comment] @hasMany(indexName: "byComment", fields: ["id"])
}
type Comment @model {
id: ID!
comment: String
blogID: ID! @index(name: "byComment")
}
↓ GitHubのIssueに同様の問題が挙げられていたので貼っておきます。
動作環境
"react": "^18.2.0",
"typescript": "^4.9.5",
"amplify": "12.10.0",
"aws-amplify": "^5.2.5",
対応
Issueの中にあった、リレーションを双方向に付与するという方法を使用してみます。
変更後のスキーマ
schema.grapql
type Blog @model {
id: ID!
content: String
comments: [Comment] @hasMany(indexName: "byComment", fields: ["id"])
}
type Comment @model {
id: ID!
comment: String
blogID: ID! @index(name: "byComment")
// ↓ CommentからBlogの情報をクエリできるようになる
blog: Blog @belongsTo(fields: ["postID"])
}
結果
動作確認の結果、親オブジェクトを削除した際に子オブジェクトが正常に削除されることが確認できました。
最新のバージョンでは試していないため、もしかしたら双方向のリレーションを作成せずに子オブジェクトまで一括で削除してくれるようになっているかもしれません。。
最後まで読んでいただき、ありがとうございます。
Discussion