PHP Filament关联课程与资源时自定义Attach选择组件的问题
解决方案
一、让Attach选择框同时显示资源名称和类型,并支持双字段搜索
你之前的代码未生效,是因为recordSelectSearchColumns使用关联字段时,需要先手动在查询中关联RESOURCE_TYPE表,Filament不会自动关联关联表。按以下代码修改即可:
AttachAction::make() // 关联资源类型表,确保查询能获取到resource_type字段 ->modifyQueryUsing(function ($query) { $query->leftJoin('RESOURCE_TYPE', 'RESOURCE.resource_type_id', '=', 'RESOURCE_TYPE.id'); }) // 设置支持搜索的字段,直接使用关联后的表字段 ->recordSelectSearchColumns(['resource_name', 'RESOURCE_TYPE.resource_type']) // 自定义选项显示文本,拼接资源名称和类型 ->recordSelectOptionLabel(function ($record) { return "{$record->resource_name} ({$record->resourceType->resource_type})"; })
注意表名要和你数据库中的实际表名大小写一致,同时确保Resource模型已正确定义resourceType的belongsTo关联。
二、将Attach表单改为带筛选的完整资源表格
如果想直接展示带筛选、列完整的资源表格来选择关联,可以在AttachAction的表单中使用TableSelect组件替代默认下拉框,实现类似资源列表页的筛选、排序功能:
AttachAction::make() ->form([ TableSelect::make('resource_id') ->label('选择资源') // 关联Resource模型,指定默认显示字段 ->relationship('resources', 'resource_name') // 设置表格要显示的列,包含资源名称和类型 ->columns([ TextColumn::make('resource_name')->label('资源名称'), TextColumn::make('resourceType.resource_type')->label('资源类型'), // 可添加其他需要展示的列 ]) // 配置筛选器 ->filters([ // 资源名称搜索筛选 Filter::make('resource_name') ->form([TextInput::make('name')->placeholder('搜索资源名称')]) ->query(function ($query, $data) { return $query->where('resource_name', 'like', "%{$data['name']}%"); }), // 资源类型下拉筛选 Filter::make('resource_type') ->form([Select::make('type')->options(ResourceType::pluck('resource_type', 'id'))]) ->query(function ($query, $data) { return $query->where('resource_type_id', $data['type']); }), ]) // 允许一次选择多个资源(按需开启) ->multiple() ->required(), ])
配置完成后,点击Attach按钮会弹出带表格的表单,用户可以通过筛选器精准定位资源,再选择行完成关联。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

