我正在尝试在我的端点中返回用户及其角色。但是,当使用预先加载时,我不能只返回角色名称数组。
public function me()
{
return response()->json(Auth::guard()->user()->with('roles:name')->get());
}
返回是这样的:
[
{
"id": 1,
"username": "userJohn",
"email": "johhn@gmail.com",
"avatar": "default.jpg",
"created_at": "2018-01-17 15:58:16",
"updated_at": "2018-01-17 15:58:16",
"roles": [
{
"name": "free",
"pivot": {
"user_id": 1,
"role_id": 1
}
}
]
}
]
但我需要这个:
[
{
"id": 1,
"username": "userJohn",
"email": "john@gmail.com",
"avatar": "default.jpg",
"created_at": "2018-01-17 15:58:16",
"updated_at": "2018-01-17 15:58:16",
"roles": [ "free" ]
}
]
更新:
我试过这个:
return response()->json([
'user' => $user,
'roles' => $user->roles->pluck('name'),
]);
但这会导致角色数组随用户一起出现:
{
"user": {
"id": 1,
"username": "johhn",
"email": "johhn@gmail.com",
"avatar": "default.jpg",
"created_at": "2018-01-17 22:17:02",
"updated_at": "2018-01-17 22:17:02",
"roles": [
{
"id": 1,
"name": "free",
"created_at": "2018-01-17 22:10:24",
"updated_at": "2018-01-17 22:10:24",
"pivot": {
"user_id": 1,
"role_id": 1
}
}
]
},
"roles": [
"free"
]
}
由于您只有一个用户,因此您可以获得具有pluck()
的角色:
auth()->user()->roles->pluck('name')
如果你需要你展示的确切结构,你可以使用一个访问器并将其与$appends
属性一起使用。在Laravel5.5+中,您还可以使用Eloquent Resource类来格式化数据。
您可以使用Laravel 5.5安装附带的资源类。只需创建一个如下所示的UserResource
类。
免责声明:我刚刚修改了文档中提供的示例,您可以在此处查看完整文档:
<?php
namespace AppHttpResources;
use IlluminateHttpResourcesJsonResource;
class UserResource extends Resource
{
/**
* Transform the resource into an array.
*
* @param IlluminateHttpRequest
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
'roles' => $this->roles()->pluck('name'),
];
}
}
然后在控制器中,您可以通过以下方式返回 json:
return new UserResource(User::find(1));
但是,如果您的版本是 5.4 或更低版本,则可以使用变形金刚。请参阅此处的文档。这与 laravel 的资源类完全一样:
<?php
namespace AppTransformesr;
use AppUser;
use LeagueFractal;
use FractalTransformerAbstract;
class UserTransformer extends TransformerAbstract
{
public function transform(User $user)
{
return [
'id' => $user->id,
'name' => $user->name,
'email' => $user->email,
'created_at' => $user->created_at,
'updated_at' => $user->updated_at,
'roles' => $user->roles()->pluck('name'),
];
}
}
接下来,在控制器内部:
use LeagueFractalManager;
use LeagueFractalResourceItem;
use LeagueFractalSerializerDataArraySerializer;
// You may need to move this into a separate class
// then simply extend all your Transformers.
$manager = new Manager();
$manager->setSerializer(new DataArraySerializer());
return new Item(User::find(1), new UserTransformer);