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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:03:21