Laravel Eloquent 带权限判断的DocumentFile多条件关联查询求助
Eloquent 权限查询修正方案
原代码存在两个核心问题:
- 字段名拼写错误:原代码中
isactive与实际表字段is_active不匹配 - 缺失私有文档的访问权限过滤逻辑,未按规则校验用户对私有文件的访问权限
可直接使用的实现代码
先确认DocumentFile模型中关联定义正确(已定义可跳过):
// DocumentFile 模型内关联定义 public function document_folder() { return $this->belongsTo(DocumentFolder::class); } public function document_request() { return $this->hasMany(DocumentRequest::class); }
最终查询逻辑:
// 获取当前登录用户ID $currentUserId = auth()->id(); $data = DocumentFile::with(['document_folder', 'document_request.user.profile']) ->where('is_active', true) // 权限分组过滤:满足任意一个权限条件即可返回结果 ->where(function ($query) use ($currentUserId) { // 当前用户是文件创建者,无论私有状态均可见 $query->where('created_by', $currentUserId) // 非私有文件直接可见 ->orWhere('is_private', false) // 私有文件校验:当前用户存在对应申请记录则可见 ->orWhere(function ($subQuery) use ($currentUserId) { $subQuery->where('is_private', true) ->whereHas('document_request', function ($reqQuery) use ($currentUserId) { $reqQuery->where('user_id', $currentUserId); }); }); }) // 按文件名模糊搜索 ->when($request->search, function ($query, $search) { $query->where('name', 'ilike', '%' . trim($search) . '%'); }) // 按更新时间倒序排列 ->orderBy('updated_at', 'DESC') // 分页处理 ->paginate($paginate);
实现说明
- 所有权限条件通过嵌套
where分组包裹,避免or条件破坏全局过滤逻辑 - 私有文件的申请记录校验使用
whereHas做关联存在性判断,比先查全量数据再过滤性能更高 - 搜索逻辑增加
trim处理,避免用户输入前后空格导致搜索结果不符合预期 - 保留原有预加载写法,避免产生N+1查询问题
注意:如果使用的MySQL版本不支持
ilike语法,可以替换为不区分大小写的匹配写法:->whereRaw('LOWER(name) LIKE ?', ['%' . strtolower(trim($search)) . '%'])
内容的提问来源于stack exchange,提问作者Ade Mugni Rusmana
相关产品推荐
相关产品推荐

