DataScopeBaseModel.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. //最高权限
  45. private function makeModel(&$query, $auth_type, $user, $depart_range, $column){
  46. $query->where('top_depart_id', $user['top_depart_id']);
  47. if(empty($column)) return;
  48. if($auth_type == Employee::AUTH_ONE){
  49. //我创建的
  50. $query->where($column,$user['id']);
  51. }elseif ($auth_type == Employee::AUTH_TWO){
  52. if (empty($depart_range)) {
  53. $query->whereRaw('1 = 0');
  54. } else {
  55. $query->whereExists(function ($q) use ($column, $depart_range) {
  56. $q->from('employee_depart_permission')
  57. ->whereColumn('employee_depart_permission.employee_id', $column)
  58. ->whereIn('employee_depart_permission.depart_id', $depart_range);
  59. });
  60. }
  61. }elseif ($auth_type == Employee::AUTH_THREE){
  62. //所有
  63. }
  64. }
  65. public function getQx($data, $user){
  66. if(empty($data['menu_id'])) return Employee::AUTH_ONE; // 我的
  67. if($user['top_depart_id'] == Employee::IS_ADMIN_TWO) return Employee::AUTH_THREE; // 全部
  68. if(! empty($user['menu_permissions'][$data['menu_id']])) {
  69. //指定菜单 显示对应权限
  70. return $user['menu_permissions'][$data['menu_id']];
  71. }else{
  72. return Employee::AUTH_ONE; // 我的
  73. }
  74. }
  75. function hasMethod($class, $methodName)
  76. {
  77. $reflection = new \ReflectionClass($class);
  78. return $reflection->hasMethod($methodName);
  79. }
  80. }