如何在 laravel 中的三个模型的 pivot 中部署关系?

How to deploy relationship in pivot of three model in laravel?

我正在开发基于 laravel 框架的角色和权限。

我有 3 个模型:

Weblog
User
Permissions

这是枢轴table

user_id , weblog_id , permission_id

现在,一个用户 可以拥有一个权限 ID 为 1,2 的博客和另一个权限为 1,2,3,4

的博客

如何部署关系?以及如何在管理博客时检查用户权限。 (中间件和...)

因为权限是特定于博客的

假设枢轴 table 被称为 permission_user_weblog

class User extends Model
{
    public function weblogs()
    {
        return $this->belongsToMany(Weblog::class, 'permission_user_weblog');
    }

    public function permissionsFor(int $weblogId)
    {
        $permissionIds = null;

        $this->weblogs()
            ->where('id', $weblogId)
            ->with('permissions')
            ->get()
            ->each(function($weblog) use(&$permissionIds) {
                $permissionIds = $weblog->permissions->pluck('id');             
            });

        return $permissionIds;
    }
}


class Weblog extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class, 'permission_user_weblog');
    }

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


class Permission extends Model
{
    public function weblogs()
    {
        return $this->belongsToMany(Weblog::class, 'permission_user_weblog');
    }
}

然后你可以在任何地方检查登录用户是否对特定的博客有特定的权限

public function update(Request $request, $weblogId)
{
    $user = auth()->user();
    $permissions = $user->permissionsFor($weblogId);

    //Check whether the logged in user has permission identified by id 1 or 4 for weblog
    $can = !! $permissions->intersect([1,4])->count();

    //Do rest of processing
}

您的博客、用户、权限具有多对多关系,它是一种奇数,但如果您想要这种关系,那不是问题。

只考虑每对一个ManyToMany。每个人都可以有一个 hasManyPivot (我将其命名为 Access)(根据您的需要)。

用户模型:

class User extends Model{

/**
      * retrive weblogs
      *
      * @return BelongsToMany weblogs
      */
     public function weblogs()
     {
         return $this->belongsToMany(App\WebLog::class,'accesses_table')
                        ->withPivot("permission_id")
                        ->using(App\Access::class);
     }

/**
      * retrive permissions
      *
      * @return BelongsToMany permissions
      */
     public function permissions()
     {
         return $this->belongsToMany(App\Permission::class,'accesses_table')
                        ->withPivot("weblog_id")
                        ->using(App\Access::class);
     }

/**
      * retrive access
      *
      * @return hasMany [description]
      */
     public function accesses()
     {
         return $this->hasMany(App\Access::class, "user_id");
     }
}

博客模型:

class Weblog extends Model{

/**
      * retrive users
      *
      * @return BelongsToMany users
      */
     public function users()
     {
         return $this->belongsToMany(App\User::class,'accesses_table')
                        ->withPivot("permission_id")
                        ->using(App\Access::class);
     }

/**
      * retrive permissions
      *
      * @return BelongsToMany permissions
      */
     public function permissions()
     {
         return $this->belongsToMany(App\Permission::class,'accesses_table')
                        ->withPivot("user_id")
                        ->using(App\Access::class);
     }

/**
      * retrive access
      *
      * @return hasMany [description]
      */
     public function accesses()
     {
         return $this->hasMany(App\Access::class, "weblog_id");
     }
}

权限模型:

class Permission extends Model{

/**
      * retrieve users
      *
      * @return BelongsToMany users
      */
     public function users()
     {
         return $this->belongsToMany(App\User::class,'accesses_table')
                        ->withPivot("weblog_id")
                        ->using(App\Access::class);
     }

/**
      * retrieve weblogs
      *
      * @return BelongsToMany weblogs
      */
     public function weblogs()
     {
         return $this->belongsToMany(App\Weblog::class,'accesses_table')
                        ->withPivot("user_id")
                        ->using(App\Access::class);
     }

/**
      * retrive access
      *
      * @return hasMany [description]
      */
     public function accesses()
     {
         return $this->hasMany(App\Access::class, "permission_id");
     }
}

你可以为你的 pivot 创建一个 model,我将其命名为 Access :

Illuminate\Database\Eloquent\Relations\Pivot;

class Access extends Pivot
{

    public $incrementing = true;

public function user()
    {
        return $this->belongsTo(App\User::class);
    }

    public function weblog()
    {
        return $this->belongsTo(App\Weblog::class);
    }

    public function permission()
    {
        return $this->belongsTo(App\Permission::class);
    }

}