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

如何在Filament Admin Resource中添加where条件获取筛选结果

Filament Resource 追加全局查询条件实现方法

完全可以实现,且不需要修改模型全局作用域,直接在User Resource层修改基础查询即可,不会影响项目其他位置对User模型的调用。

具体操作步骤如下:

  • 打开已生成的User Resource文件,路径一般为app/Filament/Resources/UserResource.php
  • 在Resource类中重写getEloquentQuery()方法,在原有查询的基础上追加is_admin = 0的筛选条件即可

基础实现代码如下:

<?php

namespace App\Filament\Resources;

use App\Filament\Resources\UserResource\Pages;
use App\Models\User;
use Filament\Resources\Resource;
use Illuminate\Database\Eloquent\Builder;

class UserResource extends Resource
{
    protected static ?string $model = User::class;

    // 其他原有配置项:图标、导航分组、表单、表格配置等保持不变

    public static function getEloquentQuery(): Builder
    {
        return parent::getEloquentQuery()
            ->where('is_admin', 0);
    }

    // 其他原有方法保持不变
}

扩展说明

  • 这个修改会自动作用于该Resource下所有场景的查询:包括用户列表数据、详情页数据校验、关联字段的选项查询等,就算有人手动输入is_admin=1的用户ID尝试访问详情页,也会因为查询不到数据直接返回404,权限校验更完整。
  • 如果后续需要给高权限用户放开全量查看权限,可以在方法内加判断逻辑,示例:
public static function getEloquentQuery(): Builder
{
    $query = parent::getEloquentQuery();

    // 仅当登录用户自身是管理员时可以看到所有用户,普通管理员账号仅能看到is_admin=0的用户
    if (!auth()->user()?->is_admin) {
        $query->where('is_admin', 0);
    }

    return $query;
}
  • 不建议仅在列表页的表格查询上加where条件,这种写法只会过滤列表数据,不会拦截详情页的越权访问,也不会过滤关联选择器的选项数据,容易出现权限漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:21:34