1. Go to this page and download the library: Download maketok/datamigration library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
maketok / datamigration example snippets
use Maketok\DataMigration\MapInterface;
use Maketok\DataMigration\QueueWorkflow;
use Maketok\DataMigration\Unit\SimpleBag;
use Maketok\DataMigration\Unit\Type\Unit;
use Maketok\DataMigration\Storage\Db\ResourceHelperInterface;
use Maketok\DataMigration\Action\Type\CreateTmpFiles;
use Maketok\DataMigration\Action\Type\Load;
use Maketok\DataMigration\Action\Type\Move;
use Maketok\DataMigration\Input\Shaper\Processor\Nulls;
$customerUnit = new Unit('customers');
$customerUnit->setTable('customers');
$customerUnit->setMapping([
'id' => 'map.customer_id'
// ExpressionLanguage is used to interpret string expressions
'email' => 'mail.email',
// closure or any other callable is also acceptable
'name' => function (MapInterface $map) {
return $map['name'];
},
'age' => 'map.age',
]);
/*
* the is_entity condition resolves whether
* unit should consider current row as the entity
* some utility functions are available in
* Maketok\DataMigration\Expression\HelperExpressionsProvider
*/
$customerUnit->setIsEntityCondition("trim(map.email) is not empty");
/*
* the contributions is the way for unit to
* add some data into general pool for every other unit to use
*
* This is the logic for assigning customer_id
* First it checks if it exists in the pre-compiled Hashmap
* If it does not, it's calling for frozen increment for "new_customer_id" key
* and assign the last increment id if it's non existent
* The frozenIncr is different from incr in that it's incremented only once
* is_entity condition resolves for current row
* So it's perfect for incrementing "parent" entities
*/
$customerUnit->addContribution(function (
MapInterface $map,
ResourceHelperInterface $resource,
array $hashmaps
) {
if (isset($hashmaps['email-id'][trim($map->email)])) {
$map['customer_id'] = $hashmaps['email-id'][trim($map->email)];
} else {
$map['customer_id'] = $map->frozenIncr(
'new_customer_id',
$resource->getLastIncrementId('customers')
)
}
});
$addressUnit = new Unit('addresses');
$addressUnit->setTable('addresses');
$addressUnit->setMapping([
'id' => 'map.incr('address_id', resource.getLastIncrementId('addresses'))'
'street' => 'map.street',
'city' => 'map.city',
'zip' => 'map.zip',
'parent_id' => 'map.customer_id',
]);
$addressUnit->setParent($customerUnit);
$bag = new SimpleBag();
$bag->addSet([$customerUnit, $addressUnit]);
/*
* Last but not least, since we're using CSV file, we need a Shaper
* instance to shape up our flat file before feeding it to CreateTmpFiles action
*/
$input = new Csv($fname, 'r', new Nulls($bag, new ArrayMap(), $this->getLanguageAdapter()));
$workflow = new QueueWorkflow($config, $result);
$workflow->add(new CreateTmpFiles($bag, $config, $languageAdapter,
$input, new ArrayMap(), $helperResource));
$workflow->add(new Load($bag, $config, $resource));
$workflow->add(new Move($bag, $config, $resource));
$workflow->execute();