Laravel How to display $hidden attribute on model on paginate

Goper Leo Zosa picture Goper Leo Zosa · Feb 7, 2018 · Viewed 19.1k times · Source

I'm using Laravel 5.5. I read about this and know this function and it works makeVisible

$hidden = ['password', 'remember_token', 'email'];

I can display email using

$profile = auth()->user()->find($request->user()->id);
$profile->makeVisible(['email']);

On the frontend email is displayed. But it not works on many results like

 // Get all users
 $users = User::with('role', 'level')->makeVisible(['email'])->paginate(10); // Doesn't work

Also try this method from Laracasts toJson it works but I can't do it using paginate. Can you provide other methods or how to solve this? My aim is to display email column that is hidden. Thanks.

Answer

Goper Leo Zosa picture Goper Leo Zosa · Feb 7, 2018

I solve this using this method.

Users.php on model

public function toArray()
{
    // Only hide email if `guest` or not an `admin`
    if (auth()->check() && auth()->user()->isAdmin()) {
        $this->setAttributeVisibility();
    }

    return parent::toArray();
}

public function setAttributeVisibility()
{
    $this->makeVisible(array_merge($this->fillable, $this->appends, ['enter_relationship_or_other_needed_data']));
}

and on controller just a simple

return User::with('role', 'level')->paginate(10);

I've read where pagination comes from toArray before creating pagination. Thanks for all your help. Also helps