Laravel如何在paginate上显示模型上的$ hidden属性

时间:2018-02-07 02:46:14

标签: php laravel laravel-5.5 laravel-paginate

我使用的是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

另外尝试使用此方法from Laracasts toJson它有效但我无法使用paginate执行此操作。你能提供其他方法或如何解决这个问题吗?我的目标是显示隐藏的email列。感谢。

4 个答案:

答案 0 :(得分:4)

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

模型上的

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分页的来源。感谢你的帮助。 Also helps

答案 1 :(得分:1)

您可以使用此:

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

答案 2 :(得分:0)

您可以尝试使用此方法。使用API Resources

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);

答案 3 :(得分:0)

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

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

您也可以将其用于findget

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