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

Filament表单中实现下拉选择框依赖两个字段时出现初始化错误的求助

Filament表单中实现下拉选择框依赖两个字段时出现初始化错误的求助

大家好,我在使用Filament 3.3.29(搭配Laravel和PHP 8.4.8)开发时遇到了一个表单依赖的问题,想请教一下社区的各位。

先跟大家说下之前正常运行的场景:我按照Filament的表单高级用法文档,实现了Edit表单里workflow_transition_id下拉选择框依赖workflow_id文本输入框的功能,代码如下,运行完全符合预期:

Select::make('workflow_id')
    ->options(Workflow::all()->pluck('name', 'id'))
    ->label('Workflow')
    ->searchable()
    ->preload()
    ->live()
    ->required(),

TextInput::make('workflow_status_id')
    ->label('Current Status')
    ->live()
    ->hiddenOn('create'),

Select::make('workflow_transition_id')
    ->relationship(
        name: 'workflow.workflow_transitions',
        titleAttribute: 'name',
        modifyQueryUsing: fn (Builder $query, Get $get) => $query->where('workflow_id', $get('workflow_id')),
    )
    ->label('New status')
    ->disabled(fn(Get $get) : bool => ! filled($get('workflow_id')))
    ->searchable()
    ->preload()
    ->required(),

现在我的需求是:让workflow_transition_id这个下拉框同时依赖workflow_id和workflow_status_id这两个字段。于是我修改了modifyQueryUsing的闭包,尝试添加第二个Get参数,并新增一个where条件来过滤from_workflow_status_id,修改后的核心代码片段是:

Select::make('workflow_transition_id')
    ->relationship(
        name: 'workflow.workflow_transitions',
        titleAttribute: 'name',
        modifyQueryUsing: fn (Builder $query, Get $get, Get $get2) => $query
            ->where('workflow_id', $get('workflow_id'))
            ->where('from_workflow_status_id', $get2('workflow_status_id')),
    )
    ->label('New status')
    ->disabled(fn(Get $get) : bool => ! filled($get('workflow_id')))
    ->searchable()
    ->preload()
    ->required(),

结果修改后,Laravel直接抛出了这个错误:

Typed property Filament\Forms\Components\Component::$container must not be accessed before initialization

我还做了一些调试尝试:如果把$get2('workflow_status_id')硬编码成一个有效的ID值(比如2),代码就能正常运行;后来我甚至放弃用relationship方法,改成自己用options方法查询数据,写法类似:

->options(function(Get $get, Get $get2) {
    return WorkflowTransition::where('workflow_id', $get('workflow_id'))
        ->where('from_workflow_status_id', $get2('workflow_status_id'))
        ->pluck('name');
})

但还是报出了同样的初始化错误。

另外补充一下场景:这个是在Edit表单中,workflow_status_id是从数据库读取的现有记录值,不是用户在创建表单时输入的。我已经查了Stack Overflow、Laracasts、Filament官方文档等很多地方,但都没找到实现这种双字段依赖下拉框的案例,实在摸不着头绪,希望大家能给我一些思路,谢谢!


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:58:00