function taxonomy_update_8502

Copy hierarchy from {taxonomy_term_hierarchy} to {taxonomy_term__parent}.

File

core/modules/taxonomy/taxonomy.install, line 61

Code

function taxonomy_update_8502(&$sandbox) {
    $database = \Drupal::database();
    if (!isset($sandbox['current'])) {
        // Set batch ops sandbox.
        $sandbox['current'] = 0;
        $sandbox['tid'] = -1;
        $sandbox['delta'] = 0;
        $sandbox['limit'] = Settings::get('entity_update_batch_size', 50);
        // Count records using a join, as there might be orphans in the hierarchy
        // table. See https://www.drupal.org/project/drupal/issues/2997982.
        $select = $database->select('taxonomy_term_hierarchy', 'h');
        $select->join('taxonomy_term_data', 'd', 'h.tid = d.tid');
        $sandbox['max'] = $select->countQuery()
            ->execute()
            ->fetchField();
    }
    // Save the hierarchy.
    $select = $database->select('taxonomy_term_hierarchy', 'h');
    $select->join('taxonomy_term_data', 'd', 'h.tid = d.tid');
    $hierarchy = $select->fields('h', [
        'tid',
        'parent',
    ])
        ->fields('d', [
        'vid',
        'langcode',
    ])
        ->range($sandbox['current'], $sandbox['limit'])
        ->orderBy('tid', 'ASC')
        ->orderBy('parent', 'ASC')
        ->execute()
        ->fetchAll();
    // Restore data.
    $insert = $database->insert('taxonomy_term__parent')
        ->fields([
        'bundle',
        'entity_id',
        'revision_id',
        'langcode',
        'delta',
        'parent_target_id',
    ]);
    foreach ($hierarchy as $row) {
        if ($row->tid !== $sandbox['tid']) {
            $sandbox['delta'] = 0;
            $sandbox['tid'] = $row->tid;
        }
        $insert->values([
            'bundle' => $row->vid,
            'entity_id' => $row->tid,
            'revision_id' => $row->tid,
            'langcode' => $row->langcode,
            'delta' => $sandbox['delta'],
            'parent_target_id' => $row->parent,
        ]);
        $sandbox['delta']++;
        $sandbox['current']++;
    }
    $insert->execute();
    $sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['current'] / $sandbox['max'];
    if ($sandbox['#finished'] >= 1) {
        // Update the entity type because the 'taxonomy_term_hierarchy' table is no
        // longer part of its shared tables schema.
        $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
        $definition_update_manager->updateEntityType($definition_update_manager->getEntityType('taxonomy_term'));
        // \Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema::onEntityTypeUpdate()
        // only deletes *known* entity tables (i.e. the base, data and revision
        // tables), so we have to drop it manually.
        $database->schema()
            ->dropTable('taxonomy_term_hierarchy');
        return t('Taxonomy term hierarchy has been converted to default entity reference storage.');
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.