Laravel Eloquent нагрузка на стержень - PullRequest
0 голосов
/ 12 ноября 2018

У меня на сайте есть пользователь, роли и разрешения.

Каждый пользователь принадлежит нескольким ролям (например, User.php) и сводной таблице с именем 'role_user'

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

, и каждая роль принадлежит множеству разрешений (например, Role.php) исводная таблица с именем'mission_role '

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

Я хочу каким-то образом получить доступ к разрешению пользователя, но, похоже, не могу понять это.В принципе мне нужно что-то вроде этого на User.php

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

Возможно ли это?Пожалуйста помоги.Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Если вы используете результаты в формате JSON, это будет очень легко, если вы внедрите Eloquent Resources

Определите три ресурса следующим образом:

(Примечание: чтобы легко определить ресурс, как показано ниже, выполните:

php artisan make:resource UserRes

Затем измените функцию toArray по своему желанию. ) * +1010 *

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

PermissionsRes:

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

В моем приложении приведен скриншот с примером результатов при выборке одного пользователя. Обратите внимание на вложение нескольких ролей, для которых есть несколько разрешений. Снимок экрана с ответом JSON при запросе одного пользователя

0 голосов
/ 12 ноября 2018

У 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']
        );
    }
}
...