Php Laravel如何在分页的模型上显示$hidden属性

Php Laravel如何在分页的模型上显示$hidden属性,php,laravel,laravel-5.5,laravel-paginate,Php,Laravel,Laravel 5.5,Laravel Paginate,我用的是拉威尔5.5。 我读过这篇文章,知道这个函数,它是有效的 我可以使用 $profile = auth()->user()->find($request->user()->id); $profile->makeVisible(['email']); 在前端显示电子邮件。但它对许多结果都不起作用,比如 // Get all users $users = User::with('role', 'level')->makeVisible(['email'

我用的是拉威尔5.5。 我读过这篇文章,知道这个函数,它是有效的

我可以使用

$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

也可以尝试这种方法,它可以工作,但我不能用paginate。您能否提供其他方法或如何解决此问题?我的目标是显示隐藏的
电子邮件
列。谢谢。

您可以尝试使用这种方法。使用。

API资源允许您按所需的方式格式化数据。您可以创建多个资源对象,以不同的方式格式化集合

设置visible参数(在本例中为
email
),当需要返回该项时,可以使用不同的资源对象返回该元素

因此,当不需要电子邮件时:

$users = User::with('role', 'level')->paginate(10);
return UserWithoutEmail::collection($users);
需要电子邮件时:

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

我用这个方法解决这个问题

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']));
}
在控制器上只是一个简单的例子

returnuser::with('role','level')->paginate(10)

在创建分页之前,我已经阅读了分页从哪里来的
toArray
。谢谢你的帮助

您可以使用:

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

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

// Get all users
$users = User::with('role', 'level')->paginate(10)->makeVisible(['email']);
您也可以将其与
查找
获取
一起使用:

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

试着用。是的,我试过了。仍然不起作用
$users=User::with('role','level')->makeVisible(['email'])->setVisible('email')->paginate(10)
setVisible
setHidden
仅在模型首次加载时有效。我已经尝试过这种方法了。如果在关系中使用这种方法,问题就在于它。案例用户有项目。当您返回模型项目并使用渴望加载时,json响应将隐藏电子邮件。不,如果您指定如何返回关系项(也使用API资源),则不会。无论如何,您的问题似乎已经解决,这是非常重要的一点,感谢您的解决方案!
$profile = auth()->user()->find($request->user()->id)->makeVisible(['email']);