Laravel Роли пользователя рекурсивные - PullRequest
0 голосов
/ 27 апреля 2020

Я использую Laravel с UserAuth и ролями. Все работает отлично. Теперь я хочу добавить много ролей. Роли должны быть рекурсивными.

   Schema::create('role_user', function (Blueprint $table) {
        $table->id();
        $table->timestamps();
        $table->unsignedBigInteger('user_id');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->unsignedBigInteger('role_id');
        $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');

    });

   Schema::create('role_role', function (Blueprint $table) {
        $table->id();
        $table->timestamps();
        $table->unsignedBigInteger('parent_id');
        $table->foreign('parent_id')->references('id')->on('roles')->onDelete('cascade');
        $table->unsignedBigInteger('child_id');
        $table->foreign('child_id')->references('id')->on('roles')->onDelete('cascade');
    });

$user->roles(); дают мне все роли, где пользователь назначен напрямую.

Пример:

Пользователь в роли Role1 в таблице role_user

Роль 1 в роли Role 2 в таблице role_role

Роль 2 в роли Role 3 в role_role таблица

$user->roles(); Результат - Роль 1.

$user->roles(); Результат должен содержать Роль1, Роль2, Роль3. Не как текст. Это должен быть массив

Я должен манипулировать

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

Но как?

Очень спасибо.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Я сделал свои собственные Решения, и это хорошо работает.

Роль. php:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
public function users()
{
    return $this->belongsToMany(User::class);
}

public function belongsToUser(User $user,$int)
{
    if ($this->hasUser($user)) {
        return true;
    }
    $children = $this->childrenRoles();
    if ($int > 10) {
        return false;
    }
   foreach ($children->get() as $child)
    {
        if ($child->belongsToUser($user,$int+1)) {
            return true;
        }
    }
    return false;
}

public function childrenRoles()
{
    return $this->belongsToMany(Role::class, 'role_role', 'child_id', 'parent_id');
}

public function hasUser(User $user)
{
    return null !== $this->users()->where('user_id', $user->id)->first();
}



}

Пользователь. php

public function roles()
{
    $r = Role::where('id','<>', 'null');
    foreach ($r->get() as $role)
    {
        if (! $role->belongsToUser($this,0)) {
            $r = $r->where('id', '<>', $role->id);
        }
    }
    return $r->get();
}
0 голосов
/ 27 апреля 2020

Вам необходимо выполнить рекурсивные отношения:


    public function childrenRoles()
    {
        return $this->hasMany(Role::class, 'parent_id', 'id');
    }

    public function allChildrenRoles()
    {
        return $this->childrenRoles()->with('allChildrenRoles');
    }


Затем вы можете получить доступ ко всем своим ролям, используя


    $role = Role::with('allChildrenRoles')->first();
    $role->allChildrenRoles->first()->allChildrenRoles; // .. and so on

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...