如何在Voyager的browse.blade.php中过滤用户所属学校的学生数据?
实现Voyager学生列表的所属学校过滤逻辑
方案一:Eloquent全局作用域(推荐)
在Student模型中添加全局作用域,让所有查询自动过滤当前用户所属学校的学生:
- 打开
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后台的浏览页面,不影响其他业务查询,可以自定义控制器:
- 生成专属的Student控制器:
php artisan voyager:controller Student --model=App\\Models\\Student
- 打开生成的
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); }
- 登录Voyager后台,进入BREAD管理找到
students表,将控制器路径修改为App\Http\Controllers\Voyager\StudentController,保存后生效。
关键注意点
- 确认
User模型的school_id字段已正确填充,登录用户的该字段存在有效值。 - 管理员角色务必排除过滤逻辑,避免无法查看全量学生数据。
内容的提问来源于stack exchange,提问作者zkaili
相关产品推荐
相关产品推荐

