Laravel使用Eloquent ORM查询全表时填充外键字段的实现方法
问题原因
你之前的写法有两个核心问题:
array_map回调中直接返回了$el->manager的赋值结果,会把原有Item对象直接覆盖为关联的Manager对象,丢失Item本身的所有字段belongsTo关联调用get()会返回集合对象,不是你需要的单条用户模型,同时这种逐行查询的写法会产生N+1性能问题,不推荐使用
最优解决方案:使用Laravel预加载(Eager Loading)
Laravel专门提供了with()方法用于批量加载关联数据,仅需2次查询就能拿到所有Item及对应的Manager关联数据,写法如下:
public function getall() { try { // with参数填写你定义的关联方法名即可 $items = Item::with('getManager')->get(); return response()->json(['items' => $items], 200); } catch (Throwable $err) { return response()->json($err, 400); } }
返回的JSON结构中每条Item都会自动带上get_manager字段,存储对应的关联用户数据。
可选优化建议
如果你希望关联字段名更简洁,符合Laravel命名规范,可以把关联方法名修改为manager:
// 模型中修改关联方法名 public function manager() { return $this->belongsTo(User::class, 'user_id'); }
对应控制器加载写法改为:
$items = Item::with('manager')->get();
返回的关联字段名就会变成manager,更易读。
手动遍历加载参考写法(不推荐,仅作了解)
public function getall() { try { $items = Item::get(); // 用each遍历集合,不要用array_map覆盖原对象 $items->each(function ($item) { // 直接访问动态属性即可触发关联加载,不需要手动调用get() $item->manager = $item->getManager; }); return response()->json(['items' => $items], 200); } catch (Throwable $err) { return response()->json($err, 400); } }
内容的提问来源于stack exchange,提问作者dl1
相关产品推荐
相关产品推荐

