Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何在TypeForm中筛选和计算关系项?_Database_Typescript_Nestjs_Typeorm - Fatal编程技术网

Database 如何在TypeForm中筛选和计算关系项?

Database 如何在TypeForm中筛选和计算关系项?,database,typescript,nestjs,typeorm,Database,Typescript,Nestjs,Typeorm,我的项目中有一个事件通知服务。 实体看起来像这样 @实体(“事件”) 班级活动{ @第()列 消息:字符串; @第()列 阅读日期:日期; @多通(()=>User,User=>User.events) 用户:用户; } @实体(“用户”) 类用户{ @PrimaryGeneratedColumn() id:字符串; @第()列 电子邮件:字符串; @第()列 全名:字符串; @OneToMany(()=>Event,Event=>Event.user) 事件:事件[]; 未读:数字; }

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


@实体(“事件”)
班级活动{
@第()列
消息:字符串;
@第()列
阅读日期:日期;
@多通(()=>User,User=>User.events)
用户:用户;
}
@实体(“用户”)
类用户{
@PrimaryGeneratedColumn()
id:字符串;
@第()列
电子邮件:字符串;
@第()列
全名:字符串;
@OneToMany(()=>Event,Event=>Event.user)
事件:事件[];
未读:数字;
}
类,
User
Event
是具有一对多关系的实体,正如您在实体声明中看到的那样,它们与PostgreSQL数据库正常工作

我必须找到所有用户对象及其未读事件计数

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

像这样:

。。。
const users=wait this.userRepository.find({relations:['events']});
users.forEach(user=>{
user.unread=user.events.reduce((cnt,event)=>{
if(event.readAt){return cnt+1;}
返回cnt;
}, 0);
);
...
我知道这是一个糟糕的做法,我非常肯定我可以通过TypeOrm特性实现这一点,而不是手动计数

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

。。。
构造函数(@InjectRepository(User)private userRepository:Repository){}
...
const found=wait this.usersRepository.createQueryBuilder('user'))
.leftJoinAndSelect('user.events','events')
.where('events.readAt为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

第一个参数是计数将映射到的属性名称-这将是实体上不是@列的字段

第二个是关系名

第三个是用于查询的别名

4th是可选的QueryBuilder,用于进一步筛选,在您的示例中,它检查
readAt
列是否为空