You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel使用Eloquent ORM查询全表时填充外键字段的实现方法

问题原因

你之前的写法有两个核心问题:

  1. array_map 回调中直接返回了$el->manager的赋值结果,会把原有Item对象直接覆盖为关联的Manager对象,丢失Item本身的所有字段
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:06:02