Laravel Как отобразить атрибут $hidden на модели на странице

Я использую Laravel 5.5. Я читал об этом и знаю эту функцию, и она работает makeVisible

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

Я могу отобразить электронную почту, используя

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

На интерфейсе электронной почты отображается. Но это не работает на многих результатах, как

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

Также попробуйте этот метод из Laracasts toJson, он работает, но я не могу сделать это с помощью paginate. Можете ли вы предоставить другие методы или как решить эту проблему? Моя цель - показать email столбец, который скрыт. Благодарю.

3 ответа

Решение

Я решаю это с помощью этого метода.

Users.php на модели

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

а на контроллере просто

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

Я читал, откуда исходит нумерация страниц toArray перед созданием нумерации страниц. Спасибо за вашу помощь. Также помогает

Другое возможное более простое решение в зависимости от ваших требований - позвонить makeVisible по сбору:

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

Вы также можете использовать это с find или get:

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

Вы можете использовать это:

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

Вы можете попробовать использовать этот подход. Использование ресурсов API.

Ресурсы API позволяют форматировать данные так, как вы хотите. Вы можете создать несколько объектов Resource для разных форматов ваших коллекций.

Установите видимым ваш параметр (в этом случае email) и когда вам нужно вернуть этот элемент, вы можете использовать другой объект Resource, который возвращает этот элемент.

Поэтому, когда нет необходимости в электронной почте:

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

когда нужна электронная почта:

$users = User::with('role', 'level')->paginate(10);
return UserWithEmail::collection($users);
Другие вопросы по тегам