So the idea is to use plugin migrate.process "migration" to migrate d7 field data to d8 field data.
Using migrate.process migration is better than plugin migrate.process "get" to prevent id collisions and lets us do continual migration.

This currently fails:

  field_drupal8_pages:
    plugin: migration
    migration: ya_node_page
    source: field_drupal7_pages
✝ vagrant@multi-vlad ✝ ../site/vlad_aux/d7d8-dev
$ drush ms
 Group: ya_example  Status  Total  Imported  Unprocessed  Last imported       
 d6_file            Idle    34     34        0            2016-09-16 16:40:23 
 ya_user_role       Idle    4      4         0            2016-09-16 16:40:33 
 ya_user            Idle    2      2         0            2016-09-16 16:40:40 
 ya_node_page       Idle    10     10        0            2016-09-16 16:40:48 
 ya_node_article    Idle    8      1         6            2016-09-16 17:15:34

✝ vagrant@multi-vlad ✝ ../site/vlad_aux/d7d8-dev
$ drush mi ya_node_article --limit=1
Processed 1 item (0 created, 0 updated, 1 failed, 0 ignored) - done with 'ya_node_article'                                          [status]

✝ vagrant@multi-vlad ✝ ../site/vlad_aux/d7d8-dev
$ drush mmsg ya_node_article
 source_ids_hash                                                   level   message                           
 33c8981f3a32ae575f410557a535f68eead82c0d3535cbfa5025bb9658e93d64  1       Extra unknown items in source IDs

As reference this migration uses community documentation :

Migrating Drupal 7 Page, Article to Drupal 8 Page, Article
https://www.drupal.org/node/2801003

Comments

chriscalip created an issue. See original summary.

chriscalip’s picture

Issue summary: View changes
chriscalip’s picture

File core/modules/migrate/src/Plugin/migrate/id_map/Sql.php edited to add drush_print_r for profiling purposes.

  /**
   * {@inheritdoc}
   */
  public function lookupDestinationId(array $source_id_values) {
    $results = $this->lookupDestinationIds($source_id_values);
    drush_print_r('lookupDestinationId');
    drush_print_r('$results');
    drush_print_r($results);
    return $results ? reset($results) : array();
  }

  /**
   * {@inheritdoc}
   */
  public function lookupDestinationIds(array $source_id_values) {
    drush_print_r('lookupDestinationIds begin');
    drush_print_r('$source_id_values');
    drush_print_r($source_id_values);
    if (empty($source_id_values)) {
      return array();
    }
    // Canonicalize the keys into a hash of DB-field => value.
    $is_associative = !isset($source_id_values[0]);
    $conditions = [];
    foreach ($this->sourceIdFields() as $field_name => $db_field) {
      drush_print_r('lookupDestinationIds inside foreach');
      drush_print_r('$field_name');
      drush_print_r($field_name);
      drush_print_r('$db_field');
      drush_print_r($db_field);
      if ($is_associative) {
        // Associative $source_id_values can have fields out of order.
        if (isset($source_id_values[$field_name])) {
          $conditions[$db_field] = $source_id_values[$field_name];
          unset($source_id_values[$field_name]);
        }
      }
      else {
        // For non-associative $source_id_values, we assume they're the first
        // few fields.
        if (empty($source_id_values)) {
          break;
        }
        $conditions[$db_field] = array_shift($source_id_values);
      }
    }
    drush_print_r('lookupDestinationIds after conditions');
    drush_print_r('$source_id_values');
    drush_print_r($source_id_values);
    drush_print_r('$this->sourceIdFields()');
    drush_print_r($this->sourceIdFields());
    drush_print_r('$conditions');
    drush_print_r($conditions);
    drush_print_r('$this->getSourceIDsHash(array_values($conditions))');
    drush_print_r($this->getSourceIDsHash(array_values($conditions)));
    if (!empty($source_id_values)) {
      throw new MigrateException("Extra unknown items in source IDs");
    }

    $query = $this->getDatabase()->select($this->mapTableName(), 'map')
      ->fields('map', $this->destinationIdFields());
    if (count($this->sourceIdFields()) === count($conditions)) {
      // Optimization: Use the primary key.
      $query->condition(self::SOURCE_IDS_HASH, $this->getSourceIDsHash(array_values($conditions)));
    }
    else {
      foreach ($conditions as $db_field => $value) {
        $query->condition($db_field, $value);
      }
    }
    drush_print_r('get-query');
    drush_print_r($query->__toString());
    return $query->execute()->fetchAll(\PDO::FETCH_NUM);
  }

Error Run Screenshot

✝ vagrant@multi-vlad ✝ ../site/vlad_aux/d7d8-dev
$ drush ms
 Group: ya_example  Status  Total  Imported  Unprocessed  Last imported       
 d6_file            Idle    34     34        0            2016-09-16 16:40:23 
 ya_user_role       Idle    4      4         0            2016-09-16 16:40:33 
 ya_user            Idle    2      2         0            2016-09-16 16:40:40 
 ya_node_page       Idle    10     10        0            2016-09-16 16:40:48 
 ya_node_article    Idle    8      1         6            2016-09-16 17:15:34

✝ vagrant@multi-vlad ✝ ../site/vlad_aux/d7d8-dev
$ drush mi ya_node_article --limit=1
lookupDestinationIds begin
$source_id_values
Array
(
    [target_id] => 75
)

lookupDestinationIds inside foreach
$field_name
nid
$db_field
sourceid1
lookupDestinationIds after conditions
$source_id_values
Array
(
    [target_id] => 75
)

$this->sourceIdFields()
Array
(
    [nid] => sourceid1
)

$conditions
Array
(
)

$this->getSourceIDsHash(array_values($conditions))
02db060eff943c9d3e99f79dd573e1e2ab0d52d4dd041f59a0bc63f453f0af82
Processed 1 item (0 created, 0 updated, 1 failed, 0 ignored) - done with 'ya_node_article'                                          [status]

✝ vagrant@multi-vlad ✝ ../site/vlad_aux/d7d8-dev
$ drush mmsg ya_node_article
 source_ids_hash                                                   level   message                           
 33c8981f3a32ae575f410557a535f68eead82c0d3535cbfa5025bb9658e93d64  1       Extra unknown items in source IDs 
 09b17db9613247d1118449fda0033fa7449d0cd5a1b6456dbfbcfb2bd66ff196  1       Extra unknown items in source IDs

✝ vagrant@multi-vlad ✝ ../site/vlad_aux/d7d8-dev
chriscalip’s picture

Issue summary: View changes
chriscalip’s picture

✝ vagrant@multi-vlad ✝ ../site/vlad_aux/d7d8-dev
$ drupal config:debug migrate_plus.migration.ya_node_article
 migrate_plus.migration.ya_node_article 
 langcode: en                           
 status: true                           
 dependencies: {  }                     
 id: ya_node_article                    
 migration_tags: null                   
 migration_group: ya_example            
 label: 'Nodes (Article)'               
 source:                                
   plugin: d7_node                      
   node_type: article                   
 process:                               
   nid: nid                             
   vid: vid                             
   langcode:                            
     plugin: default_value              
     source: language                   
     default_value: und                 
   title: title                         
   uid: node_uid                        
   status: status                       
   created: created                     
   changed: changed                     
   promote: promote                     
   sticky: sticky                       
   revision_uid: revision_uid           
   revision_log: log                    
   revision_timestamp: timestamp        
   body: body                           
   field_drupal8_pages:                 
     plugin: migration                  
     migration: ya_node_page            
     source: field_drupal7_pages        
 destination:                           
   plugin: 'entity:node'                
   default_bundle: article              
 migration_dependencies:                
   required:                            
     - ya_node_page     
chriscalip’s picture

Issue summary: View changes
mikeryan’s picture

Just to be clear, what is the D7 field type of field_drupal7_pages? entity_reference?

mikeryan’s picture

Title: Plugin migrate.process migration gives error on d7 field to d8 field. » D7 entity references don't migrate straight-forwardly
Category: Bug report » Support request

I played around with this locally and reproduced the problem when trying to map the field as you did. Looking at how a term reference field mapping was generated in the same migration, though:

  field_tags:
    plugin: iterator
    source: field_tags
    process:
      target_id: tid

I changed my entity reference field mapping as follows, and it worked:

  field_related_nodes:
    plugin: iterator
    source: field_related_nodes
    process:
      target_id:
        plugin: migration
        migration: upgrade_d7_node_page
        source: target_id

So, I don't think this is an actual bug, it's a matter of D7 field mappings requiring going through more hoops than D6. I'm not entirely sure why D6 is able to get away with more straight-forward mappings - it'd be nice if we could get it to recognize that source: field_related_nodes means get the primary value column (target_id) by default.

chriscalip’s picture

@mikeryan
Thanks mike! I will update the drupal 8 migration api community documentation cookbook to include this tip.

chriscalip’s picture

I am closing this issue because although the fix does not technically tackle the fail

  field_drupal8_pages:
    plugin: migration
    migration: ya_node_page
    source: field_drupal7_pages

The fix is a workaround through :

  field_drupal8_pages:
    plugin: iterator
    source: field_drupal7_pages
    process:
      target_id:
        plugin: migration
        migration: ya_node_page
        source: target_id

This is good enough. The actual fix should be another issue.

chriscalip’s picture

Status: Active » Closed (won't fix)