Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

544
Visualizações
Cómo actualizar una entidad con relaciones usando QueryBuilder en TypeORM

Tengo UserEntity y AddressEntity , están relacionados como OneToOne , es decir, un usuario puede tener solo una dirección. UserEntity tiene campos firstName , secondName , address . AddressEntity tiene campos country y city .

Si quisiera actualizar UserEntity sin hacerlo en sus relaciones, haría esto:

 await entityManager.getRepository(UserEntity) .createQueryBuilder('users') .update(UserEntity) .set(updateUserObject) .where('users.id = :userId', { userId }) .execute();

donde updateUserObject se forma a partir de un cuerpo de solicitud. Es decir, si necesito actualizar firstName , el objeto se vería así: { firstName: 'Joe' } . Ahora, lo que no está claro es cómo usar ese constructor si tengo el siguiente updateUserObject :

 { firstName: "Bob", address: { "city": "Ottawa" } }

La documentación oficial no aborda tales casos.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Puede lograr esto usando métodos de precarga y guardado .

Actualice su UserEntity similar a la siguiente:

 @Entity('user') export class UserEntity { ... @OneToOne( () => AddressEntity, { // Make sure that when you delete or update a user, it will affect the // corresponding `AddressEntity` cascade: true, // Make sure when you use `preload`, `AddressEntity` of the user will also // return (This means whenever you use any kind of `find` operations on // `UserEntity`, it would load this entity as well) eager: true } ) @JoinColumn() address: AddressEntity; }

Ahora, con entityManager , puede actualizar todos los campos que desee de la siguiente manera:

 const partialUserEntity = { id: userId, firstName: "Bob", address: { "city": "Ottawa" } }; const userRepository = await entityManager.getRepository(UserEntity); // Here we load the current user entity value from the database and replace // all the related values from `partialUserEntity` const updatedUserEntity = userRepository.preload(partialUserEntity); // Here we update (create if not exists) `updatedUserEntity` to the database await userRepository.save(updatedUserEntity);

Sin embargo, debe asegurarse de que su UserEntity tenga una AddressEntity asociada siempre. De lo contrario, deberá generar una id para AddressEntity como se muestra a continuación antes de ejecutar el método de save .

 /* * If `updatedUserEntity.address.id` is `undefined` */ // `generateIDForAddress` is a function which would return an `id` const generatedIDForAddress = generateIDForAddress(); const partialUserEntity = { id: userId, firstName: "Bob", address: { "id": generatedIDForAddress, "city": "Ottawa" } };

Tenga en cuenta que, en el fondo, typeorm ejecutará instrucciones UPDATE por separado para UserEntity y AddressEntity . Esto es solo una encapsulación de múltiples declaraciones de combinación (al ejecutar el método de preload ) y declaraciones de actualización (al ejecutar el método de save ) de modo que el desarrollador pueda implementar fácilmente este escenario.

Espero que esto te ayude. Salud 🍻!

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda