Существует ли элегантный способ использования TypeORM для поиска одной записи в массиве отношения OneToMany и назначения ее другому полю в праве? - PullRequest
4 голосов
/ 24 апреля 2020

Я ищу способ реализовать функцию, используя Nest JS и TypeORM, которая найдет в массиве OneToMany указанный элемент c и присвоит это значение другому полю в объекте. И самое главное: реализовано в одном месте в коде.

Например:

Сущность profile имеет массив photos, одна из фотографий - изображение профиля. Я хотел бы найти эту фотографию в массиве и назначить ее profilePicture, если она существует, при каждом запросе выбора. есть ли в typeORM способ реализовать это в одном месте кода?

@Entity('profile')
export class Profile extends BaseEntity {

    @PrimaryGeneratedColumn()
    id: number;

    @OneToMany(type => Photo, photo => photo.profile)
    photos?: Photo[];

    profilePicture?: Photo;
}

1 Ответ

2 голосов
/ 24 апреля 2020

Если вы используете построитель запросов, вы можете добиться этого с помощью leftJoinAndMapOne. Я просто хотел добавить пример, но я только что узнал, что Документы TypeORM уже имеют хорошее решение для вашего случая использования:

 const user = await createQueryBuilder("user")
.leftJoinAndMapOne("user.profilePhoto", "user.photos", "photo", "photo.isForProfile = TRUE")
.where("user.name = :name", { name: "Timber" })
.getOne(); 

Редактировать: В качестве альтернативы вы можете установить профиль в вашей сущности, используя декоратор Afterload:

@AfterLoad()
private setProfile(): void {
    this.photos.forEach((photo) => {
        if (photo.isForProfile) {
            this.photo = value;
        }
    });
}
...