| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?php
- namespace App\Model;
- use Illuminate\Database\Eloquent\Model;
- class DataScopeBaseModel extends Model
- {
- //人员id字段 创建人
- const employee_column = '';
- //有权限的人的表
- const table_column = '';
- //有权限的人的表关联id
- const table_id_column = '';
- public function __construct(array $attributes = [])
- {
- parent::__construct($attributes);
- }
- //根据公司过滤
- public function scopeTopClear($query, $user, $search)
- {
- $top_depart_id = "top_depart_id";
- // 获取当前查询的表名或别名(这样无论你起什么别名 i 还是 item_details 都能自适应)
- $table = $query->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);
- }
- }
|