Automattic\WooCommerce\Database\Migrations
MetaToMetaTableMigrator::classify_update_insert_records
Classify each record on whether to migrate or update.
Method of the class: MetaToMetaTableMigrator{}
No Hooks.
Returns
Array[]. Returns two arrays, first for records to migrate, and second for records to upgrade.
Usage
// private - for code of main (parent) class only $result = $this->classify_update_insert_records( $to_migrate, $already_migrated ): array;
- $to_migrate(array) (required)
- Records to migrate.
- $already_migrated(array) (required)
- Records already migrated.
MetaToMetaTableMigrator::classify_update_insert_records() MetaToMetaTableMigrator::classify update insert records code WC 10.5.0
private function classify_update_insert_records( array $to_migrate, array $already_migrated ): array {
$to_update = array();
$to_insert = array();
$to_delete = array();
foreach ( $to_migrate as $entity_id => $rows ) {
// Meta keys we need to fully delete because they don't exist in the source data.
$no_longer_exist = array_diff_key(
$already_migrated[ $entity_id ] ?? array(),
$rows
);
if ( $no_longer_exist ) {
$to_delete[ $entity_id ] = array_merge( $to_delete[ $entity_id ] ?? array(), $no_longer_exist );
}
foreach ( $rows as $meta_key => $meta_values ) {
// If there is no corresponding record in the destination table then insert.
// If there is single value in both already migrated and current then update.
// If there are multiple values in either already_migrated records or in to_migrate_records, then insert instead of updating.
if ( ! isset( $already_migrated[ $entity_id ][ $meta_key ] ) ) {
if ( ! isset( $to_insert[ $entity_id ] ) ) {
$to_insert[ $entity_id ] = array();
}
$to_insert[ $entity_id ][ $meta_key ] = $meta_values;
} else {
if ( 1 === count( $meta_values ) && 1 === count( $already_migrated[ $entity_id ][ $meta_key ] ) ) {
if ( $meta_values[0] === $already_migrated[ $entity_id ][ $meta_key ][0]['meta_value'] ) {
continue;
}
if ( ! isset( $to_update[ $entity_id ] ) ) {
$to_update[ $entity_id ] = array();
}
$to_update[ $entity_id ][ $meta_key ] = array(
'id' => $already_migrated[ $entity_id ][ $meta_key ][0]['id'],
// phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
'meta_value' => $meta_values[0],
);
continue;
}
// There might be multiple entries with the same value, or destination entries that no longer exist in the source data.
// It is easier to delete all existing entries with this meta key and insert fresh new ones to honor multiplicity, etc.
$to_delete[ $entity_id ][ $meta_key ] = $already_migrated[ $entity_id ][ $meta_key ];
if ( ! isset( $to_insert[ $entity_id ] ) ) {
$to_insert[ $entity_id ] = array();
}
$to_insert[ $entity_id ][ $meta_key ] = $meta_values;
}
}
}
return array( $to_insert, $to_update, $to_delete );
}