option('dry-run'); $withSnapshot = (bool) $this->option('with-snapshot'); $n = 0; Venue::query()->orderBy('id')->chunkById(100, function ($venues) use ($dry, $withSnapshot, &$n) { foreach ($venues as $venue) { if ($this->processVenue($venue, $dry, $withSnapshot)) { $n++; } } }); if ($dry) { $this->info("(dry-run)将更新 {$n} 条记录,未写入数据库。去掉 --dry-run 后执行写入。"); } else { $this->info("已更新 {$n} 条记录。"); } return self::SUCCESS; } private function processVenue(Venue $venue, bool $dry, bool $withSnapshot): bool { $newMethod = HtmlToPlainText::toSingleLine($venue->booking_method); $methodChanged = (string) ($venue->booking_method ?? '') !== (string) ($newMethod ?? ''); $snapChanged = false; $newSnapMethod = null; if ($withSnapshot && is_array($venue->last_approved_snapshot) && array_key_exists('booking_method', $venue->last_approved_snapshot)) { $raw = $venue->last_approved_snapshot['booking_method']; if (is_string($raw) || $raw === null) { $newSnapMethod = HtmlToPlainText::toSingleLine($raw); $snapChanged = (string) ($raw ?? '') !== (string) ($newSnapMethod ?? ''); } } if (! $methodChanged && ! $snapChanged) { return false; } if ($methodChanged) { $this->line("venue_id={$venue->id} booking_method: 去除 HTML/实体"); } if ($snapChanged) { $this->line("venue_id={$venue->id} last_approved_snapshot.booking_method: 去除 HTML/实体"); } if ($dry) { return true; } if ($methodChanged) { $venue->booking_method = $newMethod; } if ($snapChanged) { $snap = $venue->last_approved_snapshot; $snap['booking_method'] = $newSnapMethod; $venue->last_approved_snapshot = $snap; } $venue->save(); return true; } }