You need to enable JavaScript to run this app. 如何实现Laravel Eloquent with关联取指定列、拼接字段生成自定义JSON
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Laravel Eloquent with关联取指定列、拼接字段生成自定义JSON

问题排查

当前代码和目标需求的差距主要在两点:

  • 未对Jornada主表的查询字段做限制,会把表内所有字段(包括estado、created_at、updated_at这类不需要的字段)全部返回
  • 没有对查询结果做格式转换,直接返回了带嵌套School对象的模型集合,和要求的键值对结构不匹配

核心注意点:使用Eloquent预加载关联时,主表必须携带关联匹配所需的外键字段(即Jornada模型对应School关联的school_id),同时关联表查询必须携带自身主键(即School表的id),否则会触发关联匹配失败,加载不到关联数据。你原来写的预加载部分with('school:id,nombre_colegio')是符合要求的,只需要补充主表的字段限定、再加一步结构转换即可。

代码修正方案

完整可运行的index方法

public function index(){
    $res = Jornada::where('estado', 1)
        // 限定主表只查询需要的字段,同时携带关联匹配必须的外键school_id
        ->select('id_jornada', 'nombre_jornada', 'school_id')
        // 预加载关联表的指定字段,携带关联匹配必须的主键id
        ->with('school:id,nombre_colegio')
        ->get()
        // 遍历集合生成目标结构
        ->mapWithKeys(function (Jornada $jornada) {
            // 拼接主表和关联表的字段,加空值判断避免关联缺失时报错
            $combinedString = trim(
                $jornada->nombre_jornada . ' ' . ($jornada->school?->nombre_colegio ?? '')
            );
            // 以id_jornada值为键,对应值为包含拼接字符串的数组
            return [$jornada->id_jornada => [$combinedString]];
        });

    return response()->json($res);
}

输出验证

修正后接口返回的JSON结构和要求完全一致:

{
  "1": [
    "Matutina La pradera"
  ],
  "3": [
    "Vespertina La pradera"
  ]
}

内容的提问来源于stack exchange,提问作者Carlos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 00:27:05