Saya memiliki aplikasi iOS di mana pengguna dapat masuk dan mengirim pesan satu sama lain menggunakan backend AWS Amplify. API saya dikonfigurasi menggunakan GraphQL dan saat ini terlihat seperti ini.

type User @model {
  id: ID!
  userSub: String!
  fullName: String!
}
type ChatMessage @model {
  id: ID!
  senderUserSub: String
  recieverUserSub: String
  messageText: String
  messageImageFilename: String
  dateSent: String!
}

Saya baru mengenal GraphQL dan Bahasa Definisi Skemanya. Skema di atas berfungsi namun di dalam tabel dynamodb tidak ada strukturnya, saya mencoba membuat cara yang efisien untuk menyusun data untuk perpesanan pengguna. "Hubungan satu ke banyak" adalah contoh skema yang dapat ditemukan di dalam Amplify CLI saat mengonfigurasi API. Saya mencoba menyalin contohnya berdasarkan contoh saya saat ini.

Skema hubungan satu ke banyak default

type Blog @model {
  id: ID!
  name: String!
  posts: [Post] @connection(keyName: "byBlog", fields: ["id"])
}

type Post @model @key(name: "byBlog", fields: ["blogID"]) {
  id: ID!
  title: String!
  blogID: ID!
  blog: Blog @connection(fields: ["blogID"])
  comments: [Comment] @connection(keyName: "byPost", fields: ["id"])
}

type Comment @model @key(name: "byPost", fields: ["postID", "content"]) {
  id: ID!
  postID: ID!
  post: Post @connection(fields: ["postID"])
  content: String!
}

Saya coba tiru contohnya seperti ini.

Skema yang diperbarui

type User @model {
  id: ID!
  userSub: String!
  fullName: String!
  messages: [ChatMessage] @connection(keyName: "byUser", fields: ["id"])
}
type ChatMessage @model @key(name: "byUser", fields: ["messageID"]){
  id: ID!
  messageID: ID!
  senderUserSub: String
  recieverUserSub: String
  messageText: String
  messageImageFilename: String
  dateSent: String!
  user: User @connection(fields: ["messageID"])
}

Saya bertanya-tanya apakah skema yang diperbarui di atas ini terlihat sesuai? Jika memungkinkan, adakah yang bisa memberi saya petunjuk tentang cara membuatnya dengan benar untuk pengiriman pesan? Saya tidak berpengalaman dalam hal GraphQL SDL.

2
GBMR 7 Juli 2020, 04:02

1 menjawab

Jawaban Terbaik

Anda tidak perlu menggunakan atribut @key untuk koneksi semacam ini. Anda dapat memberi nama @connection sehingga amplify memahami koneksi mana yang Anda maksud seperti ini:

@connection(name: "nameOfYourConnection")

Nama harus diberikan pada atribut koneksi pada kedua jenis.

type User @model {
  id: ID!
  userSub: String
  fullName: String
  chatMessages: [ChatMessage] @connection(name: "UserChatMessageConnection") #new
}

type ChatMessage @model {
  id: ID!
  senderUserSub: String 
  recieverUserSub: String
  messageText: String
  messageImageFilename: String
  dateSent: String!
  user: User @connection(name: "UserChatMessageConnection") #new
}

Setelah Anda menjalankan push amplify, Anda akan melihat mutasi yang dihasilkan, bahwa ketika Anda membuat objek ChatMessage, Anda harus memberinya nilai bernama chatMessagesUserId. Ini adalah referensi (id pada tipe pengguna) yang digunakan pengguna untuk membuat ChatMessage.

5
marc_s 13 Juli 2020, 20:23