13

我正在使用 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 到 Json 的这种方法它可以工作,但我不能使用分页来做到这一点。你能提供其他方法或如何解决这个问题吗?我的目标是显示email隐藏的列。谢谢。

4

4 回答 4

10

我使用这种方法解决了这个问题。

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在创建分页之前,我已经阅读了分页的来源。感谢你的帮助。也有帮助

于 2018-02-07T04:30:41.983 回答
6

根据您的要求,另一个可能更简单的解决方案是调用makeVisible集合:

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

您也可以将其与findor一起使用get

$profile = auth()->user()->find($request->user()->id)->makeVisible(['email']);
于 2020-08-17T13:04:39.173 回答
5

你可以使用这个:

    $paginator = User::with('role', 'level')->paginate($pageSize);
    $data = $pagination->getCollection();
    $data->each(function ($item) {
        $item->setHidden([])->setVisible(['email']);
    });
    $paginator->setCollection($data);
    return $paginator;
于 2018-07-13T10:31:03.800 回答
2

您可以尝试使用这种方法。使用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);
于 2018-02-07T03:54:01.720 回答