public function Sql::saveIdMapping in Drupal 8
Same name and namespace in other branches
- 9 core/modules/migrate/src/Plugin/migrate/id_map/Sql.php \Drupal\migrate\Plugin\migrate\id_map\Sql::saveIdMapping()
Saves a mapping from the source identifiers to the destination identifiers.
Called upon import of one row, we record a mapping from the source ID to the destination ID. Also may be called, setting the third parameter to NEEDS_UPDATE, to signal an existing record should be re-migrated.
Parameters
\Drupal\migrate\Row $row: The raw source data. We use the ID map derived from the source object to get the source identifier values.
array $destination_id_values: An array of destination identifier values.
int $status: (optional) Status of the source row in the map. Defaults to self::STATUS_IMPORTED.
int $rollback_action: (optional) How to handle the destination object on rollback. Defaults to self::ROLLBACK_DELETE.
Overrides MigrateIdMapInterface::saveIdMapping
File
- core/
modules/ migrate/ src/ Plugin/ migrate/ id_map/ Sql.php, line 619
Class
- Sql
- Defines the sql based ID map implementation.
Namespace
Drupal\migrate\Plugin\migrate\id_mapCode
public function saveIdMapping(Row $row, array $destination_id_values, $source_row_status = MigrateIdMapInterface::STATUS_IMPORTED, $rollback_action = MigrateIdMapInterface::ROLLBACK_DELETE) {
// Construct the source key.
$source_id_values = $row
->getSourceIdValues();
// Construct the source key and initialize to empty variable keys.
$fields = [];
foreach ($this
->sourceIdFields() as $field_name => $key_name) {
// A NULL key value is usually an indication of a problem.
if (!isset($source_id_values[$field_name])) {
$this->message
->display($this
->t('Did not save to map table due to NULL value for key field @field', [
'@field' => $field_name,
]), 'error');
return;
}
$fields[$key_name] = $source_id_values[$field_name];
}
if (!$fields) {
return;
}
$fields += [
'source_row_status' => (int) $source_row_status,
'rollback_action' => (int) $rollback_action,
'hash' => $row
->getHash(),
];
$count = 0;
foreach ($destination_id_values as $dest_id) {
$fields['destid' . ++$count] = $dest_id;
}
if ($count && $count != count($this
->destinationIdFields())) {
$this->message
->display(t('Could not save to map table due to missing destination id values'), 'error');
return;
}
if ($this->migration
->getTrackLastImported()) {
$fields['last_imported'] = time();
}
$keys = [
$this::SOURCE_IDS_HASH => $this
->getSourceIdsHash($source_id_values),
];
// Notify anyone listening of the map row we're about to save.
$this->eventDispatcher
->dispatch(MigrateEvents::MAP_SAVE, new MigrateMapSaveEvent($this, $fields));
$this
->getDatabase()
->merge($this
->mapTableName())
->key($keys)
->fields($fields)
->execute();
}