简体   繁体   中英

Duplicated value in my JSON response in Laravel

I created method show() in controller to return name and timestamps + all permissions this role has. Spatie/Laravel-Permission is responsible for associating users with permissions and roles in my API.

    public function show($name)
    {
        $role = Role::findByName($name);
        return response()->json([
            $role,
            $role->permissions
        ]);
    }

Output:

[
    {
        "name": "root",
        "created_at": "2019-04-08 19:41:49",
        "updated_at": "2019-04-08 19:41:49",
        "permissions": [
            {
                "name": "users.store"
            },
            {
                "name": "users.destroy"
            },
            {
                "name": "users.show.id"
            },
            {
                "name": "users.update.id"
            },
            {
                "name": "users.show.name"
            },
            {
                "name": "users.update.name"
            }
        ]
    },
    [
        // This is duplicate
        {
            "name": "users.store"
        },
        {
            "name": "users.destroy"
        },
        {
            "name": "users.show.id"
        },
        {
            "name": "users.update.id"
        },
        {
            "name": "users.show.name"
        },
        {
            "name": "users.update.name"
        }
    ]
]

As you can see there is useless duplicate of permissions.

But if I will remove $role from my response

        return response()->json([
//            $role,
            $role->permissions
        ]);

Everything is fine

[
    [
        {
            "name": "users.store"
        },
        {
            "name": "users.destroy"
        },
        {
            "name": "users.show.id"
        },
        {
            "name": "users.update.id"
        },
        {
            "name": "users.show.name"
        },
        {
            "name": "users.update.name"
        }
    ]
]

And when I want to return only $role without permissions like this:

        return response()->json([
            $role,
//            $role->permissions
        ]);

My output is:

[
    {
        "name": "root",
        "created_at": "2019-04-08 19:41:49",
        "updated_at": "2019-04-08 19:41:49"
    }
]

When you call $role->permissions in your response, permissions are loaded into the $role object, and then serialized to json. So basically you're sending $role object with loaded permissions, and you're also sending permissions themselves.

Try:

public function show($name)
{
    $role = Role::findByName($name)->load('permissions');

    return response()->json([
        $role
    ]);
}

you can use Eloquent: API Resources here

public function show($name)
{
    return new RoleResource(Role::findByName($name));
}

and RoleResource like this:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class RoleResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'name' => $this->name,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
            'permissions' => $this-> permissions,
        ];
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM