#javascript #rest #controller #backend #nestjs
#javascript #остальное #контроллер #серверная часть #nestjs
Вопрос:
У меня есть две сущности: User и Photo с отношениями OneToMany. У одного пользователя может быть много фотографий. Пользователь:
@Entity('users')
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstName: string;
@Column()
lastName: string;
@Exclude()
@Column()
password: string;
@Column({ default: '' })
avatar: string;
@OneToMany(() => Photo, photo => photo.user, { cascade: true })
photos: Photo[];
}
И фото:
@Entity('photos')
export class Photo {
@PrimaryGeneratedColumn()
id: number;
@Column()
url: string;
@Column({default: ""})
description: string;
@ManyToOne(() => User, user => user.photos)
user: User;
}
Итак, мой вопрос: как я могу добавить новую фотографию конкретному пользователю? Я пытался сделать что-то подобное, но это работает не так, как ожидалось.
@Patch(':id/photos')
addPhoto(@Param('id') id: number, @Body() createPhotoDto: CreatePhotoDto){
return this.userService.createImage(id, createPhotoDto);
}
async createImage(id: number, createPhotoDto: CreatePhotoDto) {
const user = await this.usersRepository.findOne(id);
const newUser = await this.usersRepository.preload({
id: id,
photos: [...user.photos, createPhotoDto]
});
return this.usersRepository.save(newUser);
}
Комментарии:
1. можете ли вы поделиться своим createPhotoDto?
2. @Youba экспортирует класс CreatePhotoDto { url: string }
Ответ №1:
Что я получил от CreatePhotoDto, что вы сохраняете изображение и связываете его с пользователем,
один из самых простых способов сделать это, сначала объявите свой imageRepository в своем сервисе, а затем :
async createImage(id: number, createPhotoDto: CreatePhotoDto) {
const user = await this.usersRepository.findOne(id);
return await this.imageRepository.save({url:createPhotoDto.url,user:user});
// if you want to return the user with the image added you make another find with the relation exp:
// return await this.usersRepository.findOne(id,{ relations: ['photos'],});
}
Комментарии:
1. Спасибо. Но какой трудный путь? И какой из них лучше?
2. Я просто использовал «самый простой способ», чтобы описать это решение как более чистое, как вы видите, мы сделали это в одной строке со стороны imageRepository, а не со стороны пользователя