如何替换MongoDB查询结果中的collection并获取关联数据总数量
问题原因
你遇到的修改不生效有两个核心原因:
foreach默认是值传递逻辑,循环内的$value是原集合项的副本,修改副本不会作用到原分页数据上- Eloquent模型已加载的关联属性,不能直接通过赋值覆盖,需要调用官方提供的
setRelation方法操作
方案1:修改原有循环逻辑
在foreach中加上引用标识符,搭配setRelation方法修改关联:
$userList = UserListing::where('user_id', $user->id)->with("objects")->paginate(10); // 加&将循环改为引用传递,直接操作原数据 foreach ($userList as &$value) { $total = count($value["objects"]); // 覆盖关联数据 $value->setRelation('objects', $value["objects"]->take(2)); $value["number_objects"] = $total; } // 取消引用,避免后续逻辑出现意外的变量污染 unset($value);
如果你更习惯Laravel集合的操作风格,也可以用分页器的through方法实现相同效果,不需要处理引用:
$userList = UserListing::where('user_id', $user->id)->with("objects")->paginate(10); $userList->through(function ($item) { $total = $item->objects->count(); $item->setRelation('objects', $item->objects->take(2)); $item->number_objects = $total; return $item; });
方案2:更优的查询层实现(推荐)
不需要查询全量关联数据再裁剪,直接在查询阶段通过关联计数+限制关联返回条数实现,性能更高:
$userList = UserListing::where('user_id', $user->id) // 预加载关联总条数,会自动生成objects_count属性 ->withCount('objects') // 限制关联只返回2条数据 ->with(['objects' => function($query) { $query->take(2); }]) ->paginate(10);
查询完成后直接通过$item->objects_count获取关联总条数,$item->objects就是已经裁剪为2条的关联集合,不需要额外循环处理。
内容的提问来源于stack exchange,提问作者Efraín
相关产品推荐
相关产品推荐

