option('limit'); $buckets = Search::query() ->whereNull('area_label') ->select('lat_bucket', 'lng_bucket') ->distinct() ->when($limit > 0, fn ($query) => $query->limit($limit)) ->get(); if ($buckets->isEmpty()) { $this->info('No searches need an area label.'); return self::SUCCESS; } $resolved = 0; $rowsUpdated = 0; foreach ($buckets as $bucket) { $label = $postcodes->reverseResolve((float) $bucket->lat_bucket, (float) $bucket->lng_bucket); if ($label === null) { continue; } $resolved++; $rowsUpdated += Search::query() ->whereNull('area_label') ->where('lat_bucket', $bucket->lat_bucket) ->where('lng_bucket', $bucket->lng_bucket) ->update(['area_label' => $label]); } $this->info("Resolved {$resolved} of {$buckets->count()} areas, updated {$rowsUpdated} search rows."); return self::SUCCESS; } }