作者 lyh

gxAiblog自动发布

... ... @@ -130,47 +130,59 @@ class lyhDemo extends Command
public function _actions() {
echo '565' . PHP_EOL;
echo '开始执行...' . PHP_EOL;
ProjectServer::useProject(565);
$table = 'gl_product_keyword';
$connection = DB::connection('custom_mysql');
// 获取当前数据库名,确保正确
$dbName = $connection->getDatabaseName();
$brandsStr = 'Trimos,insize,Fowler,Mahr,Starrett,Tesa,Mitutoyo,Wixey,Shars,Fisso,Spi,Grizzly,Accumaster,Accuremote,Baker,Sharpe,Compac,Earth,Etalon,Federal,Fell,Fisso,Fowler,Gem,Grizzly,Husky,iGaging,Insize,Kanetec,Magnetics,Mighty,Mitutoyo,Noga,Pittsburgh,Procheck,Saker,Scherr Tumico,Shars,Shinwa,SPI,Starrett,Tesa,Technidea,Trimos,Verdict,Wyler,Wixey';
$brands = array_unique(array_map('trim', explode(',', $brandsStr)));
// 获取文本类型字段
// 获取文本字段
$columns = $connection->table('information_schema.columns')
->where('table_schema', $dbName)
->where('table_name', $table)
->whereIn('data_type', ['varchar', 'text', 'mediumtext', 'longtext'])
->pluck('column_name')
->toArray();
// 构建正则表达式,(?i)忽略大小写,匹配品牌名和品牌名加'-'
// 用|分隔,注意特殊字符转义
$escapedBrands = array_map(function($brand) {
return preg_quote($brand, '/');
}, $brands);
// 匹配品牌名,后面可有可无'-',使用单词边界\b保证匹配完整单词
$pattern = '(?i)\b(' . implode('|', $escapedBrands) . ')-?\b';
if (empty($columns)) {
echo "未找到文本字段,退出。" . PHP_EOL;
return;
}
foreach ($columns as $field) {
$sqlField = "`$field`";
// MySQL 8.0+ 支持 REGEXP_REPLACE,忽略大小写替换
$sql = "UPDATE `$table`
SET $sqlField = REGEXP_REPLACE($sqlField, '$pattern', '')
WHERE $sqlField IS NOT NULL AND $sqlField != ''";
echo "执行字段:$field" . PHP_EOL;
$connection->update($sql);
// 构造第一轮REPLACE表达式(原样品牌)
$replaceExprRaw = $sqlField;
foreach ($brands as $brand) {
$safeBrand = addslashes($brand);
$replaceExprRaw = "REPLACE(REPLACE($replaceExprRaw, '$safeBrand-', ''), '$safeBrand', '')";
}
// 构造第二轮REPLACE表达式(小写品牌)
$lowerBrands = array_map('strtolower', $brands);
$replaceExprLower = $sqlField;
foreach ($lowerBrands as $brand) {
$safeBrand = addslashes($brand);
$replaceExprLower = "REPLACE(REPLACE($replaceExprLower, '$safeBrand-', ''), '$safeBrand', '')";
}
// 先执行原样品牌替换
$sqlRaw = "UPDATE `$table` SET $sqlField = $replaceExprRaw WHERE $sqlField IS NOT NULL AND $sqlField != ''";
echo "执行字段(品牌原样替换):$field" . PHP_EOL;
try {
$connection->update($sqlRaw);
} catch (\Exception $e) {
echo "字段 $field 原样替换出错:" . $e->getMessage() . PHP_EOL;
}
// 再执行小写品牌替换
$sqlLower = "UPDATE `$table` SET $sqlField = $replaceExprLower WHERE $sqlField IS NOT NULL AND $sqlField != ''";
echo "执行字段(品牌小写替换):$field" . PHP_EOL;
try {
$connection->update($sqlLower);
} catch (\Exception $e) {
echo "字段 $field 小写替换出错:" . $e->getMessage() . PHP_EOL;
}
}
echo '执行结束' . PHP_EOL;
DB::disconnect('custom_mysql');
}
}
... ...