web-dev-qa-db-fra.com

Laravel Comment afficher l'attribut $ hidden sur le modèle lors de la pagination

J'utilise Laravel 5.5 . Je lis à ce sujet et je connais cette fonction et ça marche makeVisible

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

Je peux afficher un email en utilisant 

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

Sur l'e-mail frontal est affiché. Mais ça ne marche pas sur beaucoup de résultats comme

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

Essayez aussi cette méthode de Laracasts àJson cela fonctionne mais je ne peux pas le faire en utilisant paginate. Pouvez-vous fournir d'autres méthodes ou comment résoudre ce problème? Mon but est d’afficher la colonne email qui est masquée. Merci.

5
Goper Leo Zosa

Je résous cela en utilisant cette méthode.

Users.php sur le modèle

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']));
}

et sur le contrôleur juste un simple 

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

J'ai lu d'où venait la pagination toArray avant de créer la pagination. Merci pour votre aide. Aide également

4
Goper Leo Zosa

Vous pouvez utiliser ceci:

    $paginator = User::with('role', 'level')->paginate($pageSize);
    $data = $pagination->getCollection();
    $data->each(function ($item) {
        $item->setHidden([])->setVisible(['email']);
    });
    $paginator->setCollection($data);
    return $paginator;
1
Star lin

Vous pouvez essayer d'utiliser cette approche. Utilisation de Ressources API .

Ressources API vous permet de formater les données comme vous le souhaitez. Vous pouvez créer plusieurs objets Ressource pour formater vos collections de différentes manières.

Définissez votre paramètre visible (dans ce cas, email) et lorsque vous devez renvoyer cet élément, vous pouvez utiliser un autre objet Resource qui renvoie cet élément.

Alors, quand pas besoin d'email:

$users = User::with('role', 'level')->paginate(10);
return UserWithoutEmail::collection($users);

quand un email est nécessaire:

$users = User::with('role', 'level')->paginate(10);
return UserWithEmail::collection($users);
0
HCK