Laravel 8 一对多关联自定义查询字段问题:仅返回Student模型的firstname和lastname
如何在Laravel 8的一对多关联中仅返回关联模型的指定字段?
嘿,我来帮你搞定这个需求!想要让关联的Student数据只返回firstname和lastname字段,其实有几种简洁的实现方式,而且都是在查询阶段就过滤字段,比拿到所有数据再处理要高效得多:
方法一:使用闭包自定义关联查询
你可以在with方法里传入闭包,对关联的Student查询进行字段筛选。注意一定要包含外键user_id,因为Laravel需要这个字段来建立User和Student之间的关联,不然关联数据会是空的哦。
修改控制器里的代码:
public function show(){ $users = User::with(['students' => function($query) { // 必须包含user_id,否则关联无法匹配 $query->select('user_id', 'firstname', 'lastname'); }])->find(5); return response()->json($users); }
方法二:简洁的字段指定写法
Laravel还支持更简短的语法,直接在关联名称后面用冒号分隔指定字段,同样要记得带上外键:
public function show(){ $users = User::with('students:user_id,firstname,lastname')->find(5); return response()->json($users); }
可选:隐藏不需要的外键(如果需要)
如果你连user_id也不想返回给前端,可以在获取数据后用makeHidden方法移除它:
public function show(){ $user = User::with('students:user_id,firstname,lastname')->find(5); // 从关联的students集合中隐藏user_id字段 $user->students->makeHidden('user_id'); return response()->json($user); }
这样处理后,返回的JSON里students数组就只会有firstname和lastname两个字段啦:
{ "id": 5, "email": "student1@test.com", "email_verified_at": null, "created_at": "2021-06-27T01:52:28.000000Z", "updated_at": "2021-06-27T01:52:28.000000Z", "students": [ { "firstname": "Ms", "lastname": "Zee" }, { "firstname": "my Name", "lastname": "k" } ] }
内容的提问来源于stack exchange,提问作者iChapp
相关产品推荐
相关产品推荐

