需扩展请求参数解析、数据库查询构建与响应优化,通过fillable添加name和mime_type,用where闭包模糊匹配search,白名单校验type/status,模型作用域封装过滤,排序字段白名单校验后orderby置于paginate前。

要在Laravel项目中为文件管理器添加搜索、过滤和排序功能,需在已有文件列表基础上扩展请求参数解析、数据库查询构建与响应结构优化,避免全量加载后在PHP层处理导致性能崩塌。
添加搜索字段支持
在文件模型(如App\Models\File)的$fillable数组中加入name和mime_type,确保后续whereLike能安全绑定字段。
在控制器的索引方法中,接收search请求参数:若存在且非空,则用where闭包对name和description字段执行LIKE %{$search}%模糊匹配。
注意:不要直接拼接SQL,必须使用DB::raw()配合orWhere时包裹括号,否则多条件组合会因优先级错乱漏查数据。
实现类型与状态双重过滤
方法一:使用数组映射校验白名单
定义允许的type值(如['image', 'pdf', 'text', 'archive']),请求参数type不在该数组中则忽略;同理处理status(如active/trashed)。
方法二:基于作用域封装逻辑
在模型中添加scopeOfType和scopeOfStatus两个本地作用域,控制器中链式调用->ofType($request->type)->ofStatus($request->status),比硬编码where更易复用。
【type参数必须小写且仅含字母数字】,前端传入IMAGE或image/jpg会导致匹配失败,后端不做自动转换。
支持按时间、大小、名称多字段排序
第一步:定义合法排序字段白名单
创建数组$allowedSorts = ['created_at', 'updated_at', 'size', 'name'],排除id等敏感字段防止注入。
第二步:提取请求参数并校验
读取$request->sort,检查是否在白名单内;再读取$request->direction,强制转为asc或desc,其他值一律设为asc。
第三步:构建排序链式调用
使用orderBy($sortField, $direction)附加到查询构造器末尾,注意不能放在paginate()之后——这会导致SQL语法错误。
这一步操作起来很简单,直接把orderBy写在paginate(20)前面就行。











