Laravel 如何在分页模型上显示 $hidden 属性
Laravel How to display $hidden attribute on model on 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 它有效,但我不能使用分页来做到这一点。你能提供其他方法或如何解决这个问题吗?我的目标是显示隐藏的 email
列。谢谢。
你可以试试这个方法。使用 API Resources.
API Resources 可让您按照自己的方式格式化数据。您可以创建多个资源对象以不同方式格式化您的集合。
将您的参数设置为可见(在本例中为 email
),当您需要 return 该项目时,您可以使用 return 该元素的不同资源对象。
所以当不需要电子邮件时:
$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']));
}
在控制器上只是一个简单的
return User::with('role', 'level')->paginate(10);
在创建分页之前,我已经阅读了分页的来源 toArray
。感谢你的帮助。 Also helps
你可以使用这个:
$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']);
您也可以将其与 find
或 get
一起使用:
$profile = auth()->user()->find($request->user()->id)->makeVisible(['email']);
我正在使用 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
列。谢谢。
你可以试试这个方法。使用 API Resources.
API Resources 可让您按照自己的方式格式化数据。您可以创建多个资源对象以不同方式格式化您的集合。
将您的参数设置为可见(在本例中为 email
),当您需要 return 该项目时,您可以使用 return 该元素的不同资源对象。
所以当不需要电子邮件时:
$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']));
}
在控制器上只是一个简单的
return User::with('role', 'level')->paginate(10);
在创建分页之前,我已经阅读了分页的来源 toArray
。感谢你的帮助。 Also helps
你可以使用这个:
$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']);
您也可以将其与 find
或 get
一起使用:
$profile = auth()->user()->find($request->user()->id)->makeVisible(['email']);