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 【问题描述】:

我想隐藏 passwordOTP 列,它们包含在 $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 并希望隐藏 passwordOTP 表中的 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()