Filament v3.3.14中如何为IconColumn实现基于模糊匹配(LIKE/CONTAINS)的图标切换逻辑?
Filament v3.3.14中如何为IconColumn实现基于模糊匹配(LIKE/CONTAINS)的图标切换逻辑?
嗨,这个场景我之前在项目里也碰到过,刚好有两个实用的方案能解决你的问题,咱们来一步步说:
方案一:直接用字符串包含判断(类似SQL的LIKE)
你可以借助Laravel自带的str_contains()辅助函数,搭配match(true)的写法来实现模糊匹配。这种方式不用提前清理字符串,直接检查字段值里是否包含目标关键词,还能顺便处理大小写不一致的情况:
Tables\Columns\IconColumn::make('test_value') ->icon(fn (string $state): string => match(true) { // 转小写后检查是否包含"high",不区分原字符串的大小写 str_contains(strtolower($state), 'high') => 'heroicon-o-check-circle', str_contains(strtolower($state), 'medium') => 'heroicon-o-x-circle', str_contains(strtolower($state), 'low') => 'heroicon-o-x-circle', str_contains(strtolower($state), 'extreme') => 'heroicon-o-x-circle', // 可选:处理所有未匹配到的情况,避免无图标显示 default => 'heroicon-o-question-mark-circle', })
这里的思路很直白:先把字段值转成小写统一判断标准,再用str_contains()检查是否包含指定关键词,match(true)会按顺序匹配第一个符合条件的规则,灵活性拉满。
方案二:先清理字符串再做精确匹配
如果你的字段格式是固定的「关键词 (数字)」,比如"Medium (12)",那更稳妥的方式是先把括号及里面的内容去掉,得到干净的关键词后再做精确匹配:
Tables\Columns\IconColumn::make('test_value') ->icon(fn (string $state): string => { // 用正则去掉括号及括号内的所有内容,同时去掉括号前的空格 $cleanState = preg_replace('/\s*\(.*?\)/', '', $state); // 转小写统一判断标准 $cleanState = strtolower($cleanState); return match($cleanState) { 'high' => 'heroicon-o-check-circle', // 多个值可以合并写在一行,代码更简洁 'medium', 'low', 'extreme' => 'heroicon-o-x-circle', default => 'heroicon-o-question-mark-circle', }; })
这个方案的优势在于,它完全避免了模糊匹配可能带来的误判(比如某个字段值意外包含"high"但实际不是这个等级),特别适合字段格式固定的场景。
小提醒
- 如果你遇到其他格式的字段值,比如"High - Level 3",可以调整正则规则或者
str_contains()的关键词,灵活适配; - 一定要加上
default分支,处理所有未预期的字段值,避免页面出现异常。
内容来源于stack exchange
相关产品推荐
相关产品推荐

