Php 枢轴的Laravel雄辩荷载关系

Php 枢轴的Laravel雄辩荷载关系,php,mysql,laravel,eloquent,has-and-belongs-to-many,Php,Mysql,Laravel,Eloquent,Has And Belongs To Many,在我的网站中,我拥有用户、角色和权限 每个用户都属于许多角色(例如user.php)和称为“role\u user”的透视表 public function roles() { return $this->belongsToMany(Role::class); } 每个角色都属于许多权限(例如Role.php)和称为“permission\u Role”的透视表 public function permissions() { return $this->belong

在我的网站中,我拥有用户、角色和权限

每个用户都属于许多角色(例如user.php)和称为“role\u user”的透视表

public function roles()
{
    return $this->belongsToMany(Role::class);
}
每个角色都属于许多权限(例如Role.php)和称为“permission\u Role”的透视表

public function permissions()
{
    return $this->belongsToMany(Permission::class);
}
我想以某种方式访问用户权限,但我似乎无法理解。基本上,我需要在User.php上使用类似的内容

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

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

拉雷维尔对直接关系没有天生的支持

我为此案例创建了一个包:

您可以这样使用它:

类用户扩展模型{
使用\Staudenmeir\elokenthasmanydeep\hassrelationships;
公共功能权限(){
返回$this->hasmanydep(
权限::类,['role\u user',role::类,'Permission\u role']
);
}
}

Laravel不支持直接关系

我为此案例创建了一个包:

您可以这样使用它:

类用户扩展模型{
使用\Staudenmeir\elokenthasmanydeep\hassrelationships;
公共功能权限(){
返回$this->hasmanydep(
权限::类,['role\u user',role::类,'Permission\u role']
);
}
}

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

定义以下三种资源:

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

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

<?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;
    }
}

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

定义以下三种资源:

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

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

<?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;
    }
}

查看快速加载。您可以使用点符号访问嵌套关系。@adam,我已经试过了,但不起作用。您能提供一个工作示例吗?尝试
User::with(['roles','roles.permissions')->find($youruserid)@adam,我试过了,但它返回了用户的名字。。。所以它不起作用了。。。如果您不想使用select子句
select('column1','column2')…
查看即时加载。您将能够使用点符号访问嵌套关系。@adam,我已经尝试过了,但不起作用。您能提供一个工作示例吗?尝试
User::with(['roles','roles.permissions'))->find($youruserid);
@adam,我试过了,但是它返回了用户的名字…所以它不起作用…我想如果你不想让用户的名字使用select子句
select('column1','column2')…