es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo aprovechar las relaciones implícitas de Prisma para crear la siguiente relación? (uno-muchos, muchos-muchos, uno-uno)

Estoy aprendiendo Prisma. Quiero aprovechar las relaciones implícitas de Prisma tanto como sea posible para la siguiente relación (y más tarde quiero usar nexus para escribir consultas):

1 Usuario puede pertenecer a muchas Conversaciones (como participante)
1 Conversación tiene una serie de usuarios (llamados participantes)
1 Usuario puede ser autor de muchos Mensajes
1 Mensaje puede tener 1 Usuario como autor
1 Conversación tiene una serie de mensajes (llamados textos)
1 Mensaje solo puede pertenecer a 1 Conversación

Hasta ahora he creado esto (pero dudo que sea correcto porque no se comporta como quiero cuando lo uso con nexus):

model Usuario {
id String @id @default(uuid())
conversaciones Conversación[]
}

model Mensaje {
id String @id @default(uuid())
idAutor String
idConversación String
autor Usuario @relation(fields: [idAutor], references: [id])
conversación Conversación @relation(fields: [idConversación], references: [id])
}

model Conversación {
id String @id @default(uuid())
participantes Usuario[]
mensajes Mensaje[]
}

¿Podría obtener algunos consejos/ayuda para continuar?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Basándonos en el diagrama de relación proporcionado, el modelo de datos que creaste parece ser correcto. Sin embargo, hay algunos cambios que podrías hacer para aprovechar mejor las relaciones implícitas de Prisma.

    En primer lugar, puedes agregar un campo participantIds al modelo Conversation para representar la matriz de IDs de participantes. Prisma genera automáticamente relaciones implícitas de muchos a muchos para los modelos Participant y Conversation basados en este campo. Este es el modelo de datos actualizado:

    model User {
      id            String         @id @default(uuid())
      conversations Conversation[]
    }
    
    model Message {
      id              String       @id @default(uuid())
      authorId        String
      author          User         @relation(fields: [authorId], references: [id])
      conversationId  String
      conversation    Conversation @relation(fields: [conversationId], references: [id])
    }
    
    model Conversation {
      id             String          @id @default(uuid())
      participantIds String[]
      participants   User[]          @relation("Participant", fields: [participantIds], references: [id])
      messages       Message[]
    }
    

    En segundo lugar, puedes agregar un campo escalar text al modelo Message en lugar de crear un modelo separado para él. Esto simplifica el modelo de datos y aún puedes consultar todos los mensajes pertenecientes a una conversación filtrando según el campo conversationId. Este es el modelo de datos actualizado:

    model User {
      id            String         @id @default(uuid())
      conversations Conversation[]
    }
    
    model Message {
      id             String       @id @default(uuid())
      text           String
      authorId       String
      author         User         @relation(fields: [authorId], references: [id])
      conversationId String
      conversation   Conversation @relation(fields: [conversationId], references: [id])
    }
    
    model Conversation {
      id            String      @id @default(uuid())
      participantIds String[]
      participants  User[]      @relation("Participant", fields: [participantIds], references: [id])
      messages      Message[]
    }
    

    Con estos cambios, ahora puedes consultar todas las conversaciones a las que pertenece un usuario y todos los mensajes en una conversación usando Nexus. Aquí hay un ejemplo:

    // Obtén todas las conversaciones a las que pertenece un usuario
    query {
      user(id: "id-de-usuario") {
        conversations {
          id
          participants {
            id
          }
          messages {
            id
            text
            author {
              id
            }
          }
        }
      }
    }
    
    // Obtén todos los mensajes pertenecientes a una conversación
    query {
      conversation(id: "id-de-conversación") {
        messages {
          id
          text
          author {
            id
          }
        }
      }
    }
    

    ¡Espero que esto ayude! Hazme saber si tienes alguna otra pregunta.

Comments are closed.