Laravel - 方法 Illuminate\\Support\\Collection::makeHidden 不存在
Posted
技术标签:
【中文标题】Laravel - 方法 Illuminate\\\\Support\\\\Collection::makeHidden 不存在【英文标题】:Laravel - Method Illuminate\\Support\\Collection::makeHidden does not existLaravel - 方法 Illuminate\\Support\\Collection::makeHidden 不存在 【发布时间】:2021-09-27 18:22:46 【问题描述】:我想隐藏 password
和 OTP
列,它们包含在 $uses
结果中。实际上这两列是users
表的一部分。我试过如下。但它会产生错误 - Method Illuminate\\Support\\Collection::makeHidden does not exist
。如何解决这个问题?任何建议..
$users = DB::table('users')
->join('location', 'users.id', '=', 'location.id')
->join('user_technical_details', 'users.id', '=', 'user_technical_details.id')
->get();
$d=$users->makeHidden(['password','OTP']);
return response()->json([
'message' => 'profile viewed successfully',
'data' => $d,
'statusCode' => 200,
'status' => 'success'],200);
【问题讨论】:
makeHidden()
是一种雄辩的方法,而不是查询构建器。您可以select()
您的查询,然后它将仅显示选定的列。 ->select('id','name')->get()
或 ->get(['id','name'])
你使用的 Laravel 版本是什么? makeHidden()
存在于 v5.8
【参考方案1】:
您正在尝试在集合上执行此方法,但它是模型方法:
$users = DB::table('users')
->join('location', 'users.id', '=', 'location.id')
->join('user_technical_details', 'users.id', '=', 'user_technical_details.id')
->get();
foreach($users as $user)
$user->makeHidden(['password','OTP']);
这仍然不起作用,因为您使用的是 DB::table('users')
而不是 Users::all()
。
要使用模型,您必须执行以下操作:
型号:
class User extends Model
// Instead of `makeHidden()` you can do this if you want them always to be hidden
// protected $hidden = ['password','OTP'];
public function location()
return $this->hasOne(App\Models\Location::class, 'users.id', '=', 'location.id');
public function technical_details()
return $this->hasOne(App\Models\UserTechnicalDetail::class, 'users.id', '=', 'user_technical_details.id');
控制器:
$users = Users::with(['location', 'technical_details'])
->get();
foreach($users as $user)
$user->makeHidden(['password','OTP']);
【讨论】:
我在我的控制器中试过这个。Call to undefined method stdClass::makeHidden()
- 收到此错误
哦,等等。你没有模型。您确定要使用DB::table('users')
而不是Users::all()
?
我的最终需求是我需要加入 3 个表:users
,location
,user_technical_details
并希望隐藏 password
和 OTP
表中的 users
列.可以使用任何方法。使用DB::table('users')
或Users::all()
很好。通过任何方法,我都想达到这个结果
你能告诉我一个解决方案吗?
当然。更新了我的问题。你可能还需要调整一些东西。【参考方案2】:
为了从数据库中获取用户对象,你应该使用用户模型:
$users = User::query()
->join('location', 'users.id', '=', 'location.id')
->join('user_technical_details', 'users.id', '=', 'user_technical_details.id')
->get();
foreach($users as $user)
$user->makeHidden(['password','OTP']);
【讨论】:
makeHidden()
是一个Collection
方法,它不适用于Model
它既是收藏又是模型
型号:laravel.com/api/8.x/Illuminate/Database/Eloquent/Concerns/…
收藏:laravel.com/api/8.x/Illuminate/Database/Eloquent/…
奇怪,phpStorm 编辑器显示它是一种仅适用于 Collection
的方法,不适用于 Model
类【参考方案3】:
最简单的解决方案:
$users = DB::table('users')
->join('location', 'users.id', '=', 'location.id')
->join('user_technical_details', 'users.id', '=', 'user_technical_details.id')
->get()
->map(function ($user)
unset($user->password);
unset($user->OTP);
reurn $user;
);
我建议使用 Eloquent 关系而不是连接以获得更好的抽象:
https://laravel.com/docs/8.x/eloquent-relationships
【讨论】:
以上是关于Laravel - 方法 Illuminate\\Support\\Collection::makeHidden 不存在的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 8:方法 Illuminate\Database\Eloquent\Collection::latest 不存在
Laravel 5:调用未定义的方法 Illuminate\Database\Eloquent\Collection::exists()
Laravel 中不存在方法 Illuminate\Auth\SessionGuard::users
Laravel - 测试 api 时方法 Illuminate\Auth\RequestGuard::attempt 不存在
Laravel 5.2 - 调用未定义的方法 Illuminate\Support\Facades\Request::session()
laravel 5.2 调用未定义的方法 Illuminate\Database\Query\Builder::associate()