Filament表格Text Column绑定的ViewAction点击无响应问题排查
问题排查与解决
核心问题:非Eloquent模型实例导致Action失效
你这里的sql()方法返回的是分组聚合后的查询结果,不是完整的ReportShipment模型实例——查询里用了DB::raw和分组,返回的是匿名对象(stdClass),而Filament的ViewAction默认依赖Eloquent模型来处理路由、权限验证和数据绑定,这就导致点击后虽然发了请求,但后端无法正确生成模态框内容,前端也收不到正确响应。
具体修复方案
方案1:替换ViewAction为通用Action,不依赖模型
把ViewAction换成Action,手动指定模态框内容,直接使用$record(而非Model $model):
TextColumn::make('num_jobs') ->label('Total Jobs') ->alignCenter() ->action( Action::make('test') ->modalContent(fn ($record) => view( 'filament.app.widgets.pegasus.commercial.top-stats-widget', ['record' => $record] )) )
注意把闭包里的参数从Model $model改成$record,因为你的查询返回的不是Model实例,无法自动注入Model类型。
方案2:调整查询返回可识别的结构(可选)
如果坚持要用ViewAction,需要让查询返回的结果能被Filament识别为可处理的结构,可以把查询结果转换成数组:
protected function sql() { return ReportShipment::query() ->select( DB::raw('ROW_NUMBER() OVER (ORDER BY COUNT(id) DESC) as id'), 'job_operator_name', DB::raw('COUNT(id) as num_jobs') ) ->where('consol_type', 'CLD') ->whereNull('consol_co_loaded_with_code') ->groupBy('job_operator_name') ->orderByDesc('num_jobs') ->get() ->toArray(); // 转换成数组,让Filament能正确处理record }
同时Action里依然要用$record而非Model $model。
额外检查点
- 确认Blade视图路径
filament.app.widgets.pegasus.commercial.top-stats-widget正确,文件存在于resources/views/filament/app/widgets/pegasus/commercial/top-stats-widget.blade.php - 查看浏览器控制台Network标签的update请求响应,如果返回错误(比如视图不存在、参数错误),根据响应信息调整
内容的提问来源于stack exchange,提问作者oliverbj
相关产品推荐
相关产品推荐

