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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:47:07