Experimental! Alpha stability as of 8.1
Source | Process | Destination | ||
---|---|---|---|---|
|
|
|
migrate_pets/config/install/migrate_plus.migration_group.pets.yml
id: pets
label: Pet migrations
description: A few simple pet migrations.
source_type: Custom tables
source:
key: migrate
$databases = array(
'default' => array(
'default' => array(...),
),
'migrate' => array(
'default' => array(
'database' => 'pets',
...
),
),
);
migrate_pets/config/install/migrate_plus.migration.pets.yml
id: pets
label: "Friendly, Furry Pets"
migration_group: pets
source:
plugin: pet_source
destination:
plugin: "entity:node"
process:
nid: pid
title: name
type:
plugin: default_value
default_value: pet
uid:
plugin: migration
migration: pet_owners
source: oid
field_pet_type:
plugin: cat_to_dog
field_photo: picture
migration_dependencies:
required:
- pet_owners
dependencies:
enforced:
module:
- migrate_pets
migrate_plus.migration.pets.yml
source:
plugin: pet_source
\Drupal\migrate\Plugin\migrate\source\SqlBase
MigrateSourceInterface::fields()
MigrateSourceInterface::getIds()
SQLBase::query()
MigrateSourceInterface::prepareRow()
@MigrateSource
use Drupal\migrate\Plugin\migrate\source\SqlBase
/**
* Pet source from database.
*
* @MigrateSource(
* id = "pet_source"
* )
*/
class Pet extends SQLBase {
MigrateSourceInterface::fields()
/**
* {@inheritdoc}
*/
public function fields() {
return [
'pid' => $this->t('Pet id'),
'oid' => $this->t('Owner id'),
'type' => $this->t('Pet type'),
'name' => $this->t('Pet name'),
'picture' => $this->t('Pet photo'),
];
}
MigrateSourceInterface::getIds()
/**
* {@inheritdoc}
*/
public function getIds() {
return ['pid' => ['type' => 'integer']];
}
SQLBase::query()
/**
* {@inheritdoc}
*/
public function query() {
$query = $this->select('pet', 'p')
->fields('p', ['pid', 'oid', 'type', 'name', 'picture'])
->condition('picture', 'IS NOT NULL');
return $query;
}
migrate_plus.migration_group.pets.yml
source:
key: migrate
SQLBase::prepareRow()
/**
* {@inheritdoc}
*/
public function prepareRow(Row $row) {
if ($picture = $row->getSourceProperty('picture')) {
$row->setSourceProperty('picture', $this->animate($picture));
}
return parent::prepareRow($row);
}
migrate_plus.migration.pets.yml
destination:
plugin: "entity:node"
destination:
plugin: pet_dest
\Drupal\migrate\Plugin\migrate\destination\DestinationBase
MigrateDestinationInterface::fields()
MigrateDestinationInterface::getIds()
MigrateDestinationInterface::import()
MigrateDestinationInterface::rollback()
@MigrateDestination
use Drupal\migrate\Plugin\migrate\destination\DestinationBase
/**
* Pet destination.
*
* @MigrateDestination(
* id = "pet_dest"
* )
*/
class PetDestination extends DestinationBase {
MigrateDestinationInterface::fields()
/**
* {@inheritdoc}
*/
public function fields(MigrationInterface $migration = NULL) {
// TODO: Implement fields() method.
}
MigrateDestinationInterface::fields()
/**
* {@inheritdoc}
*/
public function fields(MigrationInterface $migration = NULL) {
return [
'pid' => $this->t('Pet id'),
'oid' => $this->t('Owner id'),
'type' => $this->t('Pet type'),
'name' => $this->t('Pet name'),
'photo' => $this->t('Pet photo'),
];
}
MigrateDestinationInterface::getIds()
/**
* {@inheritdoc}
*/
public function getIds() {
return [
'pid' => ['type' => 'integer']
];
}
MigrateDestinationInterface::import()
/**
* {@inheritdoc}
*/
public function import(Row $row, $old_destination_id_values = []) {
$pet = $this->save($row);
if (!$pet) {
throw new MigrateException('Could not save pet');
}
}
MigrateDestinationInterface::rollback()
/**
* {@inheritdoc}
*/
public function rollback(array $destination_identifier) {
$pet = $this->load(reset($destination_identifier));
if ($pet) {
$pet->delete();
}
}
migrate_plus.migration.pets.yml
process:
nid: pid
title:
plugin: callback
callable: trim
source: name
type:
plugin: default_value
default_value: pet
uid:
plugin: migration
migration: pet_owners
source: oid
field_pet_type:
plugin: cat_to_dog
source: type
field_photo: picture
title:
- plugin: callback
callable: trim
source: title
- plugin: substr
start: -1
length: 10
migrate_plus.migration.pets.yml
field_pet_type:
plugin: cat_to_dog
source: type
\Drupal\migrate\ProcessPluginBase
MigrateProcessInterface::transform()
@MigrateProcessPlugin
use Drupal\migrate\ProcessPluginBase
/**
* Turn cats into dogs.
*
* @MigrateProcessPlugin(
* id = "cat_to_dog",
* )
*/
class CatToDog extends ProcessPluginBase {
MigrateProcessInterface::transform()
/**
* {@inheritdoc}
*/
public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
return ($value == 'cat') ? 'dog' : $value;
}
migrate_plus.migration.pets.yml
migration_dependencies:
required:
- pet_owner
Watch out!
migrate_plus.migration.pets.yml
dependencies:
enforced:
module:
- migrate_pets
migrate-status (ms)
$ drush ms
Group: pets Status Total Imported Unprocessed Last imported
pet_owners Idle 50 0 N/A
pets Idle 1455 0 N/A
migrate-import (mi)
$ drush mi pets
Processed 1455 items (1455 created, 0 updated, 0 failed, 0 ignored) - done with 'pets'
migrate-rollback (mr)
$ drush mr pets
Rolled back 1455 items - done with 'pets'
drush migrate-stop
drush migrate-reset-status
drush migrate-messages
Slides available at
www.calebthorne.com/presentation/drupal/drupal8-migrations