Laravel枢轴的雄辩负载关系

时间:2018-11-12 01:22:56

标签: php mysql laravel eloquent has-and-belongs-to-many

在我的网站上,我具有用户,角色和权限。

每个用户都属于多个角色(例如User.php)和名为“ role_user”的数据透视表

public function roles()
{
    return $this->belongsToMany(Role::class);
}

每个角色都属于许多权限(例如Role.php)和名为“ permission_role”的数据透视表

public function permissions()
{
    return $this->belongsToMany(Permission::class);
}

我想以某种方式访问​​“用户”权限,但似乎无法弄清楚。基本上我在User.php上需要这样的东西

public function permissions()
{
    return $this->roles()->permissions();
}

这可能吗?请帮忙。谢谢。

2 个答案:

答案 0 :(得分:1)

Laravel不支持直接关系。

我为此情况创建了一个程序包:https://github.com/staudenmeir/eloquent-has-many-deep

您可以像这样使用它:

class User extends Model {
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function permissions() {
        return $this->hasManyDeep(
            Permission::class, ['role_user', Role::class, 'permission_role']
        );
    }
}

答案 1 :(得分:0)

如果您使用的是JSON格式的结果,那么如果实现Eloquent Resources

,这应该非常容易

定义以下三种资源:

(注意:要轻松定义如下所示的资源,请执行以下操作:

php artisan make:resource UserRes

然后根据需要修改toArray函数。 )

UserRes

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class UserRes extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        $user = parent::toArray($request);
        $user["roles"] = RolesRes::collection($this->roles);
        return $user;
    }
}

RolesRes

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class RolesRes extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        $res =  parent::toArray($request);
        $res["permissions"] = $this->permissions;
        return $res;
    }
}

权限Res:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class PermissionsRes extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        $perm = parent::toArray($request);
        return $perm;
    }
}

在我的应用中,这是获取单个用户时结果示例的屏幕截图。请注意具有多个权限的多个角色的嵌套。 Screenshot of a JSON response when querying a single user