You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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());
})

逻辑说明

  1. 初始加载状态:此时user_name筛选框是空的,$this->getFilter('user_name')返回空值,所以会触发user_id = 当前用户ID的限制,符合需求。
  2. 使用user_name筛选时:只要你在用户名筛选框输入了内容,$this->getFilter('user_name')就会拿到对应的值,这时候empty()判断为false,就不会再应用user_id的限制,就能正常搜索所有符合用户名的记录了。
  3. 清空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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:24:29