LoopBack 3多关联模型查询问题:自定义Include过滤器失效
解决LoopBack 3中评论与回复关联查询的Include配置问题
我来帮你搞定这个查询配置的问题!你的需求是要查询评论本身、评论的创建者、评论的所有回复,以及每个回复的创建者,这和你写的SQL逻辑完全匹配。但你当前的Include过滤器格式不对——LoopBack 3的嵌套关联语法可不是用relation1、scope1这种方式,得按照正确的嵌套结构来写。
先确认你的模型关联逻辑是没问题的:
- Comment模型通过
belongsTo关联到MyUser(评论创建者),外键userId - Comment模型通过
hasMany关联到自身(评论的回复),外键commentParentId - 每个回复(也是Comment实例)又通过
belongsTo关联到MyUser(回复的创建者)
那正确的Include过滤器应该是这样的:
{ "include": [ { "relation": "user", // 关联评论的创建者,只返回指定字段 "scope": { "fields": ["id", "username"] } }, { "relation": "comments", // 关联当前评论的所有回复 "scope": { "include": { "relation": "user", // 每个回复关联对应的创建者,返回指定字段 "scope": { "fields": ["id", "username"] } } } } ] }
配置细节说明:
- 用数组形式的
include同时声明两个关联:评论的创建者、评论的回复列表 - 对于
comments这个hasMany关联,在它的scope里嵌套include,用来关联每个回复的创建用户 - 每个关联的
scope.fields用来精准控制返回字段,和你SQL里的需求完全对应
你可以把这个过滤器直接用在Comment模型的find或findById方法中,比如:
Comment.find({ include: [ { relation: 'user', scope: { fields: ['id', 'username'] } }, { relation: 'comments', scope: { include: { relation: 'user', scope: { fields: ['id', 'username'] } } } } ] }, function(err, comments) { // 在这里处理查询结果 });
返回的结果结构会完全符合预期:每个评论对象包含自身字段、user字段(评论创建者的id和username),以及comments数组(每个回复对象包含自身字段和user字段——回复创建者的id和username)。
之前的问题核心就是用了不符合LoopBack语法的relation1、scope1写法,换成正确的嵌套数组结构就能正常生效了。
内容的提问来源于stack exchange,提问作者Cristian David Ippolito
相关产品推荐
相关产品推荐

