在Mikro-ORM与NestJS中如何在findAll()中过滤用户自身消息
问题:Mikro-ORM + NestJS 中 findAll() 过滤关联的 Messages 仅保留当前用户发送的内容
我正在使用Mikro-ORM和NestJS,系统包含Users、Games和Messages三个实体。需求是查询所有用户及其关联的Games,并且仅填充每个用户自己发送的Messages。
在find(id)函数中,因为能直接获取用户ID,很容易实现这个逻辑:
user.service.js
async find(id: number) { return await this.userRepository.findOne( { id: id }, { fields: ["name"], populate: ["games", "games.messages"], populateWhere: { messages: { user: id } } } ); }
但在findAll()函数中,无法获取当前遍历的用户ID,不知道如何指定Messages的user字段为当前用户ID:
user.service.js
async findAll() { return this.userRepository.findAll({ fields: ["name"], populate: ['games','games.messages','games.messages.game'], populateWhere: { messages: { user: user.id // <--- 无法获取 user.id } } }); }
解决方案
在Mikro-ORM的populateWhere配置中,可以通过根实体引用来关联当前查询的用户,无需手动传入ID。具体使用$ref: 'root'来指向当前查询的根实体(也就是User),这样每个用户只会加载自己发送的Messages。
修改后的findAll()代码如下:
user.service.js
async findAll() { return this.userRepository.findAll({ fields: ['name'], populate: ['games', 'games.messages', 'games.messages.game'], populateWhere: { messages: { user: { $ref: 'root' } // 关联当前查询的根User实体 } } }); }
说明
$ref: 'root'会让Mikro-ORM自动将Messages的user字段与当前查询的User实体进行关联匹配,确保每个用户仅加载自己发送的消息。如果你的实体间是双向关联(比如Message实体包含user字段,User实体包含messages字段),这种方式会自动处理关联条件,无需额外配置。
内容的提问来源于stack exchange,提问作者PizzaPeet
相关产品推荐
相关产品推荐

