getQuery()->from; // 如果 $table 里包含 " as ",说明有别名,截取别名部分 if (strpos($table, ' as ') !== false) { $segments = explode(' as ', $table); $table = trim(end($segments)); $top_depart_id = $table . '.top_depart_id'; } $query->where($top_depart_id, $user['top_depart_id']); return $query; $query->where('top_depart_id', $user['top_depart_id']); return $query; } //数据权限中 人员 部门 所有 (在公司的基础上) public function scopeClear1($query, $user, $search) { //权限范围内的部门 $depart_range = $user['depart_id'] ?? []; //个人 部门 所有 $auth_type = $this->getQx($search,$user); // 获取模型的实例 $model = $query->getModel(); // 获取模型类名 $className = get_class($model); // 人员字段 $column = defined($className . '::employee_column') ? constant($className . '::employee_column') : ''; $this->makeModel($query, $auth_type, $user, $depart_range,$column); } private function makeModel1(&$query, $auth_type, $user, $depart_range, $column){ $query->where('top_depart_id', $user['top_depart_id']); if(empty($column)) return; if($auth_type == Employee::AUTH_ONE){ //我创建的 $query->where($column,$user['id']); }elseif ($auth_type == Employee::AUTH_TWO){ if (empty($depart_range)) { $query->whereRaw('1 = 0'); } else { $query->whereExists(function ($q) use ($column, $depart_range) { $q->from('employee_depart_permission') ->whereColumn('employee_depart_permission.employee_id', $column) ->whereIn('employee_depart_permission.depart_id', $depart_range); }); } }elseif ($auth_type == Employee::AUTH_THREE){ //所有 } } public function scopeClear($query, $user, $search) { // 权限范围内的部门 $depart_range = $user['depart_id'] ?? []; // 个人 部门 所有 $auth_type = $this->getQx($search, $user); // 获取模型的实例 $model = $query->getModel(); // 获取模型类名 $className = get_class($model); // 🆕 核心修复 1:动态获取当前主表的表名,用来给字段加前缀防止别名冲突 $tableName = $model->getTable(); // 人员字段 $column = defined($className . '::employee_column') ? constant($className . '::employee_column') : ''; // 🆕 核心修复 2:如果定义了人员字段,且没有带表前缀,自动加上主表前缀 if (!empty($column) && strpos($column, '.') === false) { $column = $tableName . '.' . $column; } $this->makeModel($query, $auth_type, $user, $depart_range, $column, $tableName); } private function makeModel(&$query, $auth_type, $user, $depart_range, $column, $tableName) { // 🆕 核心修复 3:给 top_depart_id 加上主表名前缀,防止关联表也有该字段导致冲突 $query->where($tableName . '.top_depart_id', $user['top_depart_id']); if (empty($column)) return; if ($auth_type == Employee::AUTH_ONE) { // 我创建的 (此时 $column 已经是 "table_name.field" 格式) $query->where($column, $user['id']); } elseif ($auth_type == Employee::AUTH_TWO) { if (empty($depart_range)) { $query->whereRaw('1 = 0'); } else { $query->whereExists(function ($q) use ($column, $depart_range) { $q->from('employee_depart_permission') ->whereColumn('employee_depart_permission.employee_id', $column) // 这里的 $column 带有表前缀,whereColumn 完美识别 ->whereIn('employee_depart_permission.depart_id', $depart_range); }); } } elseif ($auth_type == Employee::AUTH_THREE) { // 所有 } } //根据公司过滤 加人员 public function scopeTopAndEmployeeClear($query, $user, $search) { $top_depart_id = "top_depart_id"; $table = $query->getQuery()->from; $alias = $table; // 默认为原表名 // 如果 $table 里包含 " as ",说明有别名,截取别名部分 if (strpos($table, ' as ') !== false) { $segments = explode(' as ', $table); $table = trim(end($segments)); $top_depart_id = $table . '.top_depart_id'; } $query->where($top_depart_id, $user['top_depart_id']); // 获取模型的实例 $model = $query->getModel(); // 获取模型类名 $className = get_class($model); $relationTable = defined($className . '::table_column') ? constant($className . '::table_column') : ''; $relationTableId = defined($className . '::table_id_column') ? constant($className . '::table_id_column') : ''; if($user['is_admin'] != Employee::IS_ADMIN_TWO){ if (! empty($relationTable) && ! empty($relationTableId)) { $query->whereExists(function ($subQuery) use ($relationTable, $user, $alias, $relationTableId) { $subQuery->from($relationTable) ->whereColumn($relationTable . ".{$relationTableId}", $alias . '.id') // 关联主表的 ID ->where($relationTable . '.data_id', $user['id']) // 过滤当前操作人 ->where($relationTable . '.del_time', 0) // 排除已删除的关联记录 ->where($relationTable . '.top_depart_id', $user['top_depart_id']); }); } } return $query; } public function getQx($data, $user){ if(empty($data['menu_id'])) return Employee::AUTH_ONE; // 我的 if($user['is_admin'] == Employee::IS_ADMIN_TWO) return Employee::AUTH_THREE; // 全部 if(! empty($user['menu_permissions'][$data['menu_id']])) { //指定菜单 显示对应权限 return $user['menu_permissions'][$data['menu_id']]; }else{ return Employee::AUTH_ONE; // 我的 } } function hasMethod($class, $methodName) { $reflection = new \ReflectionClass($class); return $reflection->hasMethod($methodName); } }