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

如何在Voyager的browse.blade.php中过滤用户所属学校的学生数据?

实现Voyager学生列表的所属学校过滤逻辑

方案一:Eloquent全局作用域(推荐)

在Student模型中添加全局作用域,让所有查询自动过滤当前用户所属学校的学生:

  1. 打开app/Models/Student.php,插入以下代码:
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Auth;

protected static function booted()
{
    static::addGlobalScope('school_filter', function (Builder $builder) {
        // 仅对已登录且绑定学校的非管理员用户生效
        if (Auth::check() && Auth::user()->school_id && !Auth::user()->hasRole('admin')) {
            $builder->where('school_id', Auth::user()->school_id);
        }
    });
}
  • 这个作用域会自动作用于所有Student模型的查询,包括Voyager的浏览页面,无需额外修改后台配置。
  • 如果需要给特定角色开放全量权限,只需在判断条件中排除对应角色即可。

方案二:自定义Voyager BREAD控制器

如果只想让过滤逻辑作用于Voyager后台的浏览页面,不影响其他业务查询,可以自定义控制器:

  1. 生成专属的Student控制器:
php artisan voyager:controller Student --model=App\\Models\\Student
  1. 打开生成的app/Http/Controllers/Voyager/StudentController.php,重写index方法:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

public function index(Request $request)
{
    // 给当前BREAD查询添加过滤条件
    $this->dataType->scope = function ($query) {
        if (Auth::check() && Auth::user()->school_id && !Auth::user()->hasRole('admin')) {
            $query->where('school_id', Auth::user()->school_id);
        }
    };

    return parent::index($request);
}
  1. 登录Voyager后台,进入BREAD管理找到students表,将控制器路径修改为App\Http\Controllers\Voyager\StudentController,保存后生效。

关键注意点

  • 确认User模型的school_id字段已正确填充,登录用户的该字段存在有效值。
  • 管理员角色务必排除过滤逻辑,避免无法查看全量学生数据。

内容的提问来源于stack exchange,提问作者zkaili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:50:03