Laravel调用makeHidden报错Illuminate\Support\Collection::makeHidden不存在如何解决
问题原因及解决方法
报错原因
makeHidden() 是 Laravel Eloquent 模型及 Eloquent 集合专属的方法,你通过 DB::table() 构造器查询得到的结果是基础集合类 Illuminate\Support\Collection,该类未提供 makeHidden 方法,因此调用时报错。
解决方案
方案1:改用 Eloquent 模型查询(最推荐)
先为 users 表创建对应的 Eloquent 模型,并提前定义好和 location、user_technical_details 的关联关系,查询时用预加载关联的方式获取数据,得到的 Eloquent 集合就可以正常调用 makeHidden 方法:
// User模型里提前定义好关联 class User extends Model { public function location() { return $this->hasOne(Location::class, 'id', 'id'); } public function userTechnicalDetails() { return $this->hasOne(UserTechnicalDetail::class, 'id', 'id'); } } // 业务代码 $users = User::with(['location', 'userTechnicalDetails'])->get(); $d = $users->makeHidden(['password', 'OTP']); return response()->json([ 'message' => 'profile viewed successfully', 'data' => $d, 'statusCode' => 200, 'status' => 'success' ],200);
方案2:查询时直接排除敏感字段(性能最优)
不管用DB查询还是模型查询,都可以在构造查询语句时直接指定要返回的字段,从根源上避免取出敏感字段:
$users = DB::table('users') ->join('location', 'users.id', '=', 'location.id') ->join('user_technical_details', 'users.id', '=', 'user_technical_details.id') // 只选择你需要的字段,主动排除password和OTP ->select('users.id', 'users.name', 'location.*', 'user_technical_details.*') // 按需补全其他需要的字段即可 ->get(); return response()->json([ 'message' => 'profile viewed successfully', 'data' => $users, 'statusCode' => 200, 'status' => 'success' ],200);
方案3:用基础集合的遍历方法手动移除字段
如果不想修改原有查询逻辑,可以用集合的map方法遍历每个项,手动删除敏感字段:
$users = DB::table('users') ->join('location', 'users.id', '=', 'location.id') ->join('user_technical_details', 'users.id', '=', 'user_technical_details.id') ->get(); $d = $users->map(function ($item) { unset($item->password, $item->OTP); return $item; }); return response()->json([ 'message' => 'profile viewed successfully', 'data' => $d, 'statusCode' => 200, 'status' => 'success' ],200);
内容的提问来源于stack exchange,提问作者user16468912
相关产品推荐
相关产品推荐

