DataScopeBaseModel.php 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace App\Model;
  3. use Illuminate\Database\Eloquent\Model;
  4. class DataScopeBaseModel extends Model
  5. {
  6. //人员id字段
  7. const employee_column = '';
  8. public function __construct(array $attributes = [])
  9. {
  10. parent::__construct($attributes);
  11. }
  12. //根据公司过滤
  13. public function scopeTopClear($query, $user, $search)
  14. {
  15. $top_depart_id = "top_depart_id";
  16. // 获取当前查询的表名或别名(这样无论你起什么别名 i 还是 item_details 都能自适应)
  17. $table = $query->getQuery()->from;
  18. // 如果 $table 里包含 " as ",说明有别名,截取别名部分
  19. if (strpos($table, ' as ') !== false) {
  20. $segments = explode(' as ', $table);
  21. $table = trim(end($segments));
  22. $top_depart_id = $table . '.top_depart_id';
  23. }
  24. $query->where($top_depart_id, $user['top_depart_id']);
  25. return $query;
  26. $query->where('top_depart_id', $user['top_depart_id']);
  27. return $query;
  28. }
  29. //数据权限中 人员 部门 所有 (在公司的基础上)
  30. public function scopeClear($query, $user, $search)
  31. {
  32. //权限范围内的部门
  33. $depart_range = $user['depart_id'] ?? [];
  34. //个人 部门 所有
  35. $auth_type = $this->getQx($search,$user);
  36. // 获取模型的实例
  37. $model = $query->getModel();
  38. // 获取模型类名
  39. $className = get_class($model);
  40. // 人员字段
  41. $column = defined($className . '::employee_column') ? constant($className . '::employee_column') : '';
  42. $this->makeModel($query, $auth_type, $user, $depart_range,$column);
  43. }
  44. private function makeModel(&$query, $auth_type, $user, $depart_range, $column){
  45. $query->where('top_depart_id', $user['top_depart_id']);
  46. if(empty($column)) return;
  47. if($auth_type == Employee::AUTH_ONE){
  48. //我创建的
  49. $query->where($column,$user['id']);
  50. }elseif ($auth_type == Employee::AUTH_TWO){
  51. if (empty($depart_range)) {
  52. $query->whereRaw('1 = 0');
  53. } else {
  54. $query->whereExists(function ($q) use ($column, $depart_range) {
  55. $q->from('employee_depart_permission')
  56. ->whereColumn('employee_depart_permission.employee_id', $column)
  57. ->whereIn('employee_depart_permission.depart_id', $depart_range);
  58. });
  59. }
  60. }elseif ($auth_type == Employee::AUTH_THREE){
  61. //所有
  62. }
  63. }
  64. public function getQx($data, $user){
  65. if(empty($data['menu_id'])) return Employee::AUTH_ONE; // 我的
  66. if($user['is_admin'] == Employee::IS_ADMIN_TWO) return Employee::AUTH_THREE; // 全部
  67. if(! empty($user['menu_permissions'][$data['menu_id']])) {
  68. //指定菜单 显示对应权限
  69. return $user['menu_permissions'][$data['menu_id']];
  70. }else{
  71. return Employee::AUTH_ONE; // 我的
  72. }
  73. }
  74. function hasMethod($class, $methodName)
  75. {
  76. $reflection = new \ReflectionClass($class);
  77. return $reflection->hasMethod($methodName);
  78. }
  79. }