如何在LoopBack中实现嵌套主从查询并关联Post及Attachment模型
解决LoopBack主从模型关联:在远程方法中嵌套Post与Attachment
嘿,我帮你梳理下怎么把Post和Attachment也关联进远程方法的返回结果里,先从几个关键点入手:
首先得提个小笔误——你Category关系配置里的foreignKey: "catgory_id"少了个字母e,应该改成category_id,不然关联大概率会出问题,先把这个修正了。
接下来,要实现多层模型嵌套查询,只需要在include里做层级嵌套配置就行,下面是具体的修改步骤:
1. 确认模型关系配置
确保各模型的关联关系都正确配置,特别是Post和Attachment的关联(假设Post是hasMany Attachment):
category_subs.json(保留已有的posts关联):
"relations": { "posts": { "type": "hasMany", "model": "post", "foreignKey": "category_sub_id" } }
post.json(新增Attachment的关联):
"relations": { "attachments": { "type": "hasMany", "model": "attachment", "foreignKey": "post_id" } }
2. 修改远程方法的查询逻辑
原来的查询里scope: { include: 'category_subs' }是错误的,我们需要把它换成包含posts,并在posts的scope里再嵌套attachments。同时还要调整远程方法的返回类型(原来返回string完全不符合实际返回结构):
module.exports = function (Category) { Category.categorySubs = function (id, cb) { Category.find({ where: { id: id }, include: { relation: 'categorySubs', scope: { include: { relation: 'posts', scope: { include: 'attachments' // 嵌套关联Attachment模型 } } } } }, function (err, result) { if (err) return cb(err); cb(null, result); }); } Category.remoteMethod('categorySubs', { accepts: { arg: 'id', type: 'string', required: true }, // 标记id为必填参数更严谨 returns: { arg: 'data', type: 'array', root: true }, // 改为返回数组,root: true让结果直接返回而非嵌套在data字段 http: { path: '/iteminfo', verb: 'get' } }); };
3. 逻辑说明
- 多层
include嵌套:从Category出发,先关联categorySubs,再在每个categorySubs的查询范围内关联posts,最后在每个post的范围内关联attachments,这样就能一次性拉取所有层级的关联数据。 - 返回类型调整:
Category.find返回的是数组(哪怕只匹配一个id),所以把返回类型改成array,加上root: true能让接口返回更简洁的JSON结构。 - 错误处理:新增了
if (err) return cb(err),确保查询错误能正确传递给调用方。
这样调用GET /categories/iteminfo?id=xxx时,就能拿到包含Category、category_subs、posts、attachments的完整关联数据了。
内容的提问来源于stack exchange,提问作者RSA
相关产品推荐
相关产品推荐

