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.
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 🍻!