У меня есть проект, написанный с помощьюnesjs и typeorm. В моем проекте у меня есть таблицы чат и пользователь, поэтому я хочу получить отношения ManyToOne
. Вот таблица chat
export class Chat extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@ManyToOne(() => User, (user) => user.chatsCreater, { nullable: false })
@JoinColumn({ name: 'creatorId' })
creator: User;
@ManyToOne(() => User, (user) => user.chatsCompanion, { nullable: false })
@JoinColumn({ name: 'companionId' })
companion: User;
}
и кусок из user
таблицы
...
@OneToMany(() => Chat, (chat) => chat.creator)
chatsCreater: Chat[];
@OneToMany(() => Chat, (chat) => chat.companion)
chatsCompanion: Chat[];
...
Когда я запрашиваю данные из чата, я ожидаю получить таблицу отверстий {id, companionId, creatorI}
, а не только значение chat.id
. Вот мой запрос
.createQueryBuilder('chat')
.where('chat.creatorId = :creatorId AND chat.companionId = :companionId', { creatorId, companionId })
.getOne()
и результат {id: 1}
Итак, я хочу получить значения товарища и создателя также, когда я запрашиваю из чата.
Если я изменю getOne()
на getRaw()
, я получу желаемый результат. Но в случае более сложных запросов (с несколькими объединениями) с getRaw возникает беспорядок, поэтому есть ли способ получить все столбцы с помощью getOne?
Я смог сделать это с помощью leftJoinAndSelect
.createQueryBuilder('chat')
.leftJoinAndSelect('chat.creator', 'creator')
.leftJoinAndSelect('chat.companion', 'companion')
.where('chat.creatorId = :creatorId AND chat.companionId = :companionId', { creatorId, companionId })
.getOne();
В случае, если таблица отверстий не нужна, также можно использовать leftJoin без выбора и позже добавить в запрос addSelect(['creator.id','companion.id'])