Превратите необработанный союзный запрос в красноречивые отношения - PullRequest
0 голосов
/ 04 декабря 2018

У меня вопрос о Laravel Relationships.

У меня сырой запрос на объединение, и я хочу перевести в красноречивые отношения.

Прежде всего ... у меня есть 4задействованные таблицы:

роли

id|name

разрешения

id|name|code|description

access_role

role_id|permission_id

пользователи

id|...........|role_id

missions_user

user_id|permission_id

Внутри моей модели User, у меня есть этот метод:

/**
 * @TODO: Transform this into a eloquent relationship
 * 
 * @return Collection
 */
public function permissions()
{
    $query = sprintf('
        (
            SELECT permissions.*
            FROM permissions
            INNER JOIN permission_role ON permission_role.permission_id = permissions.id
            WHERE permission_role.role_id = %s
        ) UNION
        (
            SELECT permissions.*
            FROM permissions
            INNER JOIN permission_user ON permission_user.permission_id = permissions.id
            WHERE permission_user.user_id = %s
        )', $this->role_id, $this->id);

    return Permission::hydrate(DB::select($query));
}

Дело в том, что я хочу получить все разрешения по роли, с которой связан пользователь, и по отдельным разрешениям, связанным с пользователем.

Могу ли я преобразовать это в какой-то красноречивыйтакие отношения, как hasMany, принадлежит ToMany и т.д ...?

1 Ответ

0 голосов
/ 04 декабря 2018

Функция слияния в коллекции Laravel может вам помочь.Большая разница в том, что я заранее закрываю запрос с помощью -> get () и использую merge () вместо union ()

 // In Controller 
 public function GetUsersWithPermission()
 {
      $permissionByRole = User::with('permission_role.permission')->get();
      $permissionByUser = User::with('permission_user.permission')->get();

      $result = $permissionByRole->merge($permissionByUser);
 }


// User Model : get PermissionRole By User 
public function permission_role() {
    return $this->hasOne('App/Model/permission_role', 'role_id', 'role_id'); }

public function permission_user() {
    return $this->hasOne('App/Model/permission_user', 'user_id', 'id'); }



// permission_role Model : get Permissions By Role 
public function permission(){
    return $this->hasMany('App/Model/Permissions', 'id', 'permission_id');    }

// permission_user Model : get Permissions By User 
public function permission(){
    return $this->hasMany('App/Model/Permissions', 'id', 'permission_id');    }

Примечание: у меня нет ваших данных, поэтому яЯ не могу доказать, что это работает, но, по крайней мере, это работает с моими данными, так что стоит попробовать.и он возвращает все данные, такие как: все данные пользователя и разрешения, поэтому вы можете использовать функцию select (), чтобы получить конкретные столбцы.

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