Laravel 5.5 - 预先加载 - 删除字段



我正在尝试在我的端点中返回用户及其角色。但是,当使用预先加载时,我不能只返回角色名称数组。

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

最新更新