我在加入请求后增加了用户

时间:2020-01-21 09:02:14

标签: laravel eloquent

在laravel 6应用中,我获得了成倍的用户,获得了具有相关Spatie /权限的用户, 因为我需要过滤选定的权限并显示用户权限的名称: 我做为:

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

我希望使用

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

但出现错误: 调用未定义的方法

Illuminate \ Database \ Eloquent \ Builder :: getByUserPermission()

如果有有效的方法?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您使用的是“ 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 :(得分:1)

您的范围方法“ scopeGetByUserPermission”在您的用户模型中定义,但在“ whereHas”方法中的$ query与权限模型相关的变量中。

如果要在模型中使用某些范围,请尝试此操作。

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);
相关问题