Я увеличил количество пользователей по присоединенному запросу. - PullRequest
1 голос
/ 21 января 2020

В приложении laravel 6 я увеличил количество пользователей, получающих пользователей с соответствующими размерами / разрешениями, поскольку мне нужно фильтровать выбранные разрешения и отображать имена разрешений пользователей: я делаю как:

$users = User
    ::getByName($this->filter_name)
    ->getByStatus($this->filter_status)
    ->leftJoin('model_has_permissions', 'model_has_permissions.model_id', '=', 'users.id')
    ->getByUserPermission($this->filter_user_permission, 'model_has_permissions')
    ->getByUserPermissionModelType( 'model_has_permissions')
    ->orderBy($this->order_by, $this->order_direction)
    ->offset($limit_start)
    ->take($backend_items_per_page)
    ->distinct()
    ->paginate($backend_items_per_page);

$users->getCollection()->transform(function ($user) {
    $permissions_text= '';
    $permissions  = $user->permissions;
    foreach( $permissions as $nextPermission ) {
        $permissions_text.= $nextPermission->name . ', ';
    }
    $user->permission_text = MyFuncsClass::trimRightSubString( $permissions_text, ', ' );
    return $user;
});

I ожидал, что использование

 ->distinct()

спасет его, но мне не удалось. Почему?

ОБНОВЛЕННЫЙ БЛОК: Код с whereHas:

->whereHas('permissions', function ($query): void {
    $query->where('id', $this->filter_user_permission);
})

работает нормально, если $ this-> filter_user_permission не пусто. В случае, если он пуст. Это не работает. Это внутренняя форма списка, поэтому $ this-> filter_user_permission) может быть заполнен или пуст. Чтобы исправить это, я использовал следующую область:

public function scopeGetByUserPermission($query, $permission_id= null, $table_name)
{
    if (!empty($permission_id)) {
        if ( is_array($permission_id) ) {
            $query->whereIn($table_name.'.permission_id', $permission_id);
        } else {
            $query->where($table_name.'.permission_id', $permission_id);
        }
    }
    return $query;
}

Он использовался в моем исходном сообщении.

Я пытался использовать его как:

->whereHas('permissions', function ($query): void {
    $query->getByUserPermission($this->filter_user_permission, 'model_has_permissions');
})

, но получил ошибку : Вызов неопределенного метода

Подсветка \ База данных \ Eloquent \ Builder :: getByUserPermission ()

Если есть правильный путь?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Если вы используете пакет "spatie / laravel -permission", вы можете сделать это так:

$users = User
    ::getByName($this->filter_name)
    ->getByStatus($this->filter_status)
/** ->leftJoin('model_has_permissions', 'model_has_permissions.model_id', '=', 'users.id') */
/** I don't really know what this 2 methods below does
    ->getByUserPermission($this->filter_user_permission, 'model_has_permissions') 
    ->getByUserPermissionModelType( 'model_has_permissions') */
    ->whereHas('permissions', function ($query): void {
        /** Change "permission_field" here to column which you use (example: id,name) from the "permissions" table of your database */
        $query->where('permission_field', $this->filter_user_permission);
    })
    ->orderBy($this->order_by, $this->order_direction)
    ->offset($limit_start)
    ->take($backend_items_per_page)
    ->distinct()
    ->paginate($backend_items_per_page);

Надеюсь, эта помощь для вас

1 голос
/ 22 января 2020

Ваш метод области видимости «scopeGetByUserPermission» определен в модели пользователя, но в переменной $ $ метода «whereHas», связанной с моделью разрешений.

Если вы хотите использовать некоторую область действия в своей модели, попробуйте это.

public function scopeGetByUserPermission($query, $permission_id=null/**, $table_name */)
{
    if (!empty($permission_id)) {
        $query->whereHas('permissions', function ($query) use ($permission_id): void {
            /** Cast your $permission_id variable to array and use "whereIn" method */
            $query->whereIn('permission_id', (array)$permission_id);
        });
    }
    return $query;
}

Также вы можете использовать php7 функции для аргументов в вашем методе области действия

public function scopeGetByUserPermission($query, array $permission_id=[])
{
    /** Your scope logic from the code above */
}

И вызов этой области будет выглядеть так

$users = User
    ::getByName($this->filter_name)
    ->getByStatus($this->filter_status)
    ->getByUserPermission((array)$this->filter_user_permission)
    ->orderBy($this->order_by, $this->order_direction)
    ->offset($limit_start)
    ->take($backend_items_per_page)
    ->distinct()
    ->paginate($backend_items_per_page);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...