Jenssegers MongoDB中BelongsToMany关联指定查询字段无返回怎么解决
问题根因说明
你定位的问题完全正确,Jenssegers MongoDB库的多对多关联预加载逻辑,需要从关联模型(此处为Story)的查询结果中获取主键字段和关联外键字段才能完成关联绑定,缺少任意一个都会触发关联逻辑的遍历报错。
你之前的写法存在两个遗漏:
- 没有选择Story模型的主键
_id,关联依赖主键完成模型匹配 - 虽然添加了外键
reading_list_ids,但缺少主键的情况下关联逻辑仍无法正常运行
解决方案
基础实现(返回指定字段)
预加载时必须在select中同时包含_id、关联外键reading_list_ids,以及你需要的业务字段title:
$user = auth()->user(); $readingList = ReadingList::where('user_id', $user->id) ->with(["stories" => function ($query) { $query->select("_id", "title", "reading_list_ids"); }]) ->paginate(10);
也可以用简写的预加载字段写法:
$readingList = ReadingList::where('user_id', $user->id) ->with("stories:_id,title,reading_list_ids") ->paginate(10);
隐藏冗余外键字段
如果不需要把reading_list_ids返回给前端,有两种处理方式:
- 直接在Story模型的
$hidden属性中添加reading_list_ids,隐藏仅作用于序列化输出阶段,不会影响关联绑定逻辑 - 分页场景下通过
through方法批量隐藏:
$readingList = $readingList->through(function ($item) { $item->stories->makeHidden('reading_list_ids'); return $item; });
内容的提问来源于stack exchange,提问作者Efraín
相关产品推荐
相关产品推荐

