exists(). // Online DDL, builds over existing rows; column is NOT NULL so no legacy backfill. public static function addCollectionMethodIndex() { static::addIndexIfNotExists( static::getDbPrefix() . 'fct_index_collection_method_idx', 'collection_method' ); } public static function addVendorSubscriptionIdIndex() { static::addIndexIfNotExists( static::getDbPrefix() . 'fct_index_vendor_subscription_id_idx', 'vendor_subscription_id' ); } public static function addExpiryScanIndex() { static::addIndexIfNotExists( static::getDbPrefix() . 'fct_index_expiry_scan_idx', ['status', 'next_billing_date', 'id'] ); } public static function addUuidColumn() { // "ALTER TABLE %i ADD COLUMN `uuid` VARCHAR(100) NOT NULL DEFAULT '' AFTER `id`" static::addColumnIfNotExists('uuid', "VARCHAR(100) NOT NULL DEFAULT ''", 'id'); } public static function renameInitialAmountToSignupFee() { // "ALTER TABLE %i CHANGE `initial_amount` `signup_fee` BIGINT UNSIGNED NOT NULL DEFAULT 0" static::renameColumnIfExists('initial_amount', 'signup_fee', 'BIGINT UNSIGNED NOT NULL DEFAULT 0'); } public static function backfillEmptyUuids() { $chunkSize = 500; do { $subscriptions = Subscription::select('id') ->where(function ($query) { $query->where('uuid', '') ->orWhereNull('uuid'); }) ->limit($chunkSize) ->get(); if ($subscriptions->isEmpty()) { break; } $uuids = []; foreach ($subscriptions as $subscription) { $uuids[] = [ 'id' => $subscription->id, 'uuid' => md5(time() . wp_generate_uuid4()) ]; } (new Subscription())->batchUpdate($uuids); } while ($subscriptions->count() >= $chunkSize); } }