where('post_type', 'give_payment'); } /** * @inheritDoc * * @since 4.0.0 * * @throws DatabaseMigrationException */ public function runBatch($firstId, $lastId) { $relationships = []; try { $data = DB::table('give_campaign_forms') ->select('campaign_id', 'form_id') ->getAll(); foreach ($data as $relationship) { $relationships[$relationship->campaign_id][] = $relationship->form_id; } $query = $this->query() ->select('ID') ->attachMeta( 'give_donationmeta', 'ID', 'donation_id', [DonationMetaKeys::FORM_ID(), 'formId'] ); // Migration Runner will pass null for lastId in the last step if (is_null($lastId)) { $query->where('ID', $firstId, '>'); } else { $query->whereBetween('ID', $firstId, $lastId); } $donations = $query->getAll(); $donationMeta = []; foreach ($donations as $donation) { foreach ($relationships as $campaignId => $formIds) { if (in_array($donation->formId, $formIds)) { $donationMeta[] = [ 'donation_id' => $donation->ID, 'meta_key' => DonationMetaKeys::CAMPAIGN_ID, 'meta_value' => $campaignId, ]; break; } } } if ( ! empty($donationMeta)) { DB::table('give_donationmeta') ->insert($donationMeta, ['%d', '%s', '%d']); } } catch (DatabaseQueryException $exception) { throw new DatabaseMigrationException("An error occurred while adding campaign ID to the donation meta table", 0, $exception); } } /** * @inheritDoc */ public function getItemsCount(): int { return $this->query()->count(); } /** * @inheritDoc */ public function getBatchItemsAfter($lastId): ?array { $item = DB::get_row(sprintf( 'SELECT MIN(ID) AS first_id, MAX(ID) AS last_id FROM (SELECT ID FROM %1s WHERE ID > %d ORDER BY ID ASC LIMIT %d) as batch', DB::prefix('posts'), $lastId, $this->getBatchSize() )); if ( ! $item) { return null; } return [ $item->first_id, $item->last_id, ]; } /** * @inheritDoc */ public function getBatchSize(): int { return 100; } /** * @inheritDoc */ public function hasMoreItemsToBatch($lastProcessedId): ?bool { return $this->query() ->where('ID', $lastProcessedId, '>') ->limit(1) ->count(); } /** * @inheritDoc * * @since 4.6.0 */ public function reverse(): void { DB::table('give_donationmeta') ->where('meta_key', DonationMetaKeys::CAMPAIGN_ID) ->delete(); } }