【问题标题】:Laravel How to display $hidden attribute on model on paginateLaravel 如何在分页上的模型上显示 $hidden 属性
【发布时间】:2018-07-17 05:35:29
【问题描述】:

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

【问题讨论】:

  • 尝试使用setVisible
  • 是的,我试过了。 $users = User::with('role', 'level')->makeVisible(['email'])->setVisible('email')->paginate(10); setVisiblesetHidden 仍然不起作用,仅在模型首次加载时才起作用。我已经尝试过这种方法。

标签: php laravel laravel-5.5 laravel-paginate


【解决方案1】:

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

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

【讨论】:

  • 感谢您的解决方案!
【解决方案2】:

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

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

您也可以将其与findget 一起使用:

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

【讨论】:

    【解决方案3】:

    你可以用这个:

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

    【讨论】:

      【解决方案4】:

      您可以尝试使用这种方法。使用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);
      

      【讨论】:

      • 如果在关系中使用这种方法的问题。案例用户有项目。当您返回模型项目并使用即时加载时,json 响应将隐藏电子邮件。
      • 不,如果您指定如何返回关系项(也与 API 资源一起),则不会
      • 不管怎样,看来你的问题已经解决了,这才是最重要的?
      猜你喜欢
      • 2018-08-16
      • 2021-08-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      相关资源
      最近更新 更多