gpt4 book ai didi

database - 如何过滤和计算typeorm中的关系项?

转载 作者:行者123 更新时间:2023-12-03 13:40:04 26 4
gpt4 key购买 nike

我的项目中有一个事件通知服务。
实体看起来像这样。


@Entity('event')
class Event {
@Column()
message: string;

@Column()
readAt: Date;

@ManyToOne(() => User, user => user.events)
user: User;
}

@Entity('user')
class User {
@PrimaryGeneratedColumn()
id: string;

@Column()
email: string;

@Column()
fullName: string;

@OneToMany(() => Event, event => event.user)
events: Event[];

unread: number;
}

类(class), UserEvent , 是具有一对多关系的实体,如您在实体声明中所见,并且与 PostgreSQL 数据库一起正常工作。

我必须找到所有具有未读事件计数的用户对象。

目前,我通过查找所有用户及其事件并使用 readAt 手动计算未读事件来实现这一点。事件实体中的字段。

像这样:

...
const users = await this.userRepository.find({ relations: ['events'] });

users.forEach(user => {
user.unread = user.events.reduce((cnt, event) => {
if (event.readAt) { return cnt + 1; }
return cnt;
}, 0);
);
...

我知道这是一个不好的做法,我很确定我可以通过 TypeOrm 功能而不是手动计数来实现这一点。

我唯一能做的就是过滤用户对象中的未读消息。

...
constructor(@InjectRepository(User) private userRepository: Repository<User>) { }
...
const found = await this.usersRepository.createQueryBuilder('user')
.leftJoinAndSelect('user.events', 'events')
.where('events.readAt is null')
.getMany();
...

但这也有其局限性。此查询不会返回没有任何未读事件的用户对象。

任何帮助,将不胜感激。

该应用程序是用 NestJs 框架制作的,所有代码都是用 typescript 编写的。

先感谢您。

最佳答案

尝试:

const found = await this.usersRepository.createQueryBuilder('user')
.loadRelationCountAndMap('user.unreadEventCount', 'user.events', 'event', (qb) => qb.where('event.readAt IS NULL'))
.getMany();
关于 loadRelationCountAndMap :
第一个参数是计数将映射到的属性名称 - 这将是您实体上的一个字段,而不是 @Column。
2nd 是关系名称
第三个是用于查询的别名
第四个是可选的 QueryBuilder 以进一步过滤,在您的情况下,它正在检查 readAt列为空

关于database - 如何过滤和计算typeorm中的关系项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62358239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com