改变Laravel关系输出结构

时间:2016-08-19 10:16:17

标签: laravel

我正在使用Laravel 5.2,我有

的角色和权限模型

Role.php

public function permissions()
{
   return $this->hasMany('App\Permissions');
}

如果我打电话

return Role::with('permissions')->get()

它会返回

[{
      "id": 2,
      "name": "training_vendor",
      "display_name": "Training Vendor",
      "description": "Role for vendor",
      "created_at": "2016-06-23 08:05:47",
      "updated_at": "2016-06-23 08:05:47",
      "permissions": [
        {
          "permission_id": 1,
          "role_id": 2
        },
        {
          "permission_id": 2,
          "role_id": 2
        },
        {
          "permission_id": 3,
          "role_id": 2
        },
        {
          "permission_id": 4,
          "role_id": 2
        },
        {
          "permission_id": 5,
          "role_id": 2
        }
}]

是否可以将“权限”结构更改为类似的内容?

[{
      "id": 2,
      "name": "training_vendor",
      "display_name": "Training Vendor",
      "description": "Role for vendor",
      "created_at": "2016-06-23 08:05:47",
      "updated_at": "2016-06-23 08:05:47",
      "permissions": [1,2,3,4,5]            
}]

4 个答案:

答案 0 :(得分:0)

如果你想获得一个数组(如标题所示),请使用toArray()方法:

return Role::with('permissions')->get()->toArray();

它会将集合转换为数组。

如果您需要获取自定义格式化JSON(如示例所示),请使用toArray(),然后使用foreacharray_map() / array_filter()方法重建此数组,使用json_encode()将结果编码为JSON。

我建议您按原样发送数据(不重建它的结构)到前端或其他任何地方并在那里使用它。

答案 1 :(得分:0)

我要提取您可以使用pluck()功能的权限ID集合:

$permissionIds = $role->permissions->pluck('permission_id');

您还可以在Role模型中编写一个getter函数:

public function getPermissionIds()
{
    return $this->permissions->pluck('permission_id');
}

并使用它:

$permissionIds = $role->getPermissionIds();

您甚至可以覆盖魔术__get()功能:

public function __get($attr)
{
    if ($attr === 'permissionIds') {
        return $this->getPermissionIds();
    } else {
        return parent::__get($attr);
    }
}

并访问权限ID,如属性:

$permissionIds = $role->permissionIds;

答案 2 :(得分:0)

在Laravel 5.2中,模型的返回值是 Collection 实例,可用于转换结果

$roles = Role::with('permissions')->get();
$roles->transform(function($role){
     $role['permissions'] = $role['permissions']->pluck('permission_id')->toArray();
     return $role;
});

return $roles;

此代码将提供理想的结果。

注意:您甚至可以在get函数之后链接转换函数。

答案 3 :(得分:0)

我希望这个答案能对你有所帮助,

$role = Role::all();

    foreach ($role as $index){
        $permissions= $index->permissions;
        foreach ($permissions as $permission){
            $permissionId[] = $permission->permission_id;
        }
        unset($index->permissions);

        $index['all_permissions']= $permissionId;
    }   

    return response()->json($role, 200);    

这对我有用。所以检查你的代码。