Filament Select编辑时显示article_code而非产品名称问题求助
解决Filament Repeater中Select编辑显示异常及搜索范围问题
核心问题分析
- 编辑时显示
article_code而非产品名称:Select组件仅在搜索阶段返回name作为标签,但编辑状态下无法自动将存储的article_code映射为对应名称,需手动指定标签获取逻辑。 - 搜索范围受限:当前
getSearchResultsUsing仅针对name字段搜索,未覆盖需求中的article_code和barkod字段。
解决方案代码调整
修改Select组件配置,补充标签映射逻辑并扩展搜索范围:
Select::make('article') ->label(__('Select article')) // 编辑时根据存储的article_code获取对应产品名称 ->getOptionLabelUsing(fn ($value): string => StoreArticles::where('article_code', $value)->value('name') ?? $value) // 扩展搜索范围,支持article_code、name、barkod模糊匹配 ->getSearchResultsUsing(fn (string $query) => StoreArticles::where(function ($q) use ($query) { $q->where('name', 'like', "%{$query}%") ->orWhere('article_code', 'like', "%{$query}%") ->orWhere('barkod', 'like', "%{$query}%"); })->limit(50) // 限制返回结果数量,提升搜索性能 ->pluck('name', 'article_code')) ->afterStateUpdated(function ($state, Forms\Set $set, Get $get) { ray("Picked article: " . $state); // 其他业务逻辑 }) ->searchable(['article_code', 'name','barkod']) ->columnSpan(4) ->required(),
额外优化建议
- 缓存优化:若产品数据更新频率低,可给
getOptionLabelUsing的查询添加缓存,减少数据库查询次数:
->getOptionLabelUsing(fn ($value): string => Cache::remember("article_name_{$value}", now()->hourly(), function () use ($value) { return StoreArticles::where('article_code', $value)->value('name') ?? $value; }))
- 关联逻辑校验:检查
Orders模型的orderingItems关联,若orderingItems为订单明细模型(而非直接关联StoreArticles),需调整关联关系,确保article字段存储的article_code能正确关联到产品表。 - 数据库索引优化:给
article_code、name、barkod字段添加普通索引或全文索引,提升模糊搜索的查询效率,避免1000+数据量时出现卡顿。
内容的提问来源于stack exchange,提问作者Maka
相关产品推荐
相关产品推荐

