在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()
如果有有效的方法?
谢谢!
答案 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);