Livewire PowerGrid:初始user_id筛选与user_name筛选冲突的解决咨询
Livewire PowerGrid:初始user_id筛选与user_name筛选冲突的解决咨询
我完全懂你的困扰——非管理员用户初始加载只能看到自己的工作记录,这没问题,但当你想通过用户名筛选其他用户的记录时,原来的user_id = 当前用户ID限制还在生效,导致搜不到任何结果对吧?
问题出在你当前的逻辑里:只要不是管理员,不管有没有触发用户名筛选,都会一直加上user_id的限制。咱们要做的就是只有当用户没有使用user_name筛选条件时,才应用初始的user_id过滤。
具体修改方案
核心是调整datasource()方法里的when条件,加入“是否有user_name筛选值”的判断:
原来的代码片段:
->when(auth()->user()->is_admin !== 1, function ($query) { $query->where('user_id', auth()->id()); })
修改为:
// 非管理员 + 未使用user_name筛选时,才限制只看自己的记录 ->when(auth()->user()->is_admin !== 1 && empty($this->getFilter('user_name')), function ($query) { $query->where('user_id', auth()->id()); })
逻辑说明
- 初始加载状态:此时
user_name筛选框是空的,$this->getFilter('user_name')返回空值,所以会触发user_id = 当前用户ID的限制,符合需求。 - 使用user_name筛选时:只要你在用户名筛选框输入了内容,
$this->getFilter('user_name')就会拿到对应的值,这时候empty()判断为false,就不会再应用user_id的限制,就能正常搜索所有符合用户名的记录了。 - 清空user_name筛选后:筛选框回到空值,
empty()判断为true,会重新触发user_id限制,回到只看自己记录的状态,逻辑闭环。
完整修改后的datasource()方法
public function datasource(): Builder { return Worklog::query() ->when($this->task_code, function ($query) { $query->where('projects_tasks.code', $this->task_code); }) // 关键修改:加入user_name筛选的判断 ->when(auth()->user()->is_admin !== 1 && empty($this->getFilter('user_name')), function ($query) { $query->where('user_id', auth()->id()); }) ->leftJoin('projects_tasks', 'projects_tasks.id', '=', 'worklogs.task_id') ->leftJoin('projects', 'projects.id', '=', 'projects_tasks.project_id') ->leftJoin('users', 'users.id', '=', 'worklogs.user_id') ->select('worklogs.*', 'projects.name', 'users.name as user_name', 'projects.id as project_id'); }
这样调整后,就能完美解决你遇到的冲突问题啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

