如何实现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
相关产品推荐
相关产品推荐

