UXDM可帮助开发人员将数据从一个系统或格式迁移到另一个系统。

可以使用作曲家轻松安装UXDM。只需从项目的根部运行以下命令即可。
composer require divineomega/uxdm
如果您以前从未使用过Composer Dependency Manager,请前往Commater网站,以获取有关如何开始的更多信息。
创建一个新的PHP文件以包含您的UXDM迁移代码。在此示例中,我们将其称为user-csv-import.php 。请记住要添加require 'vendor/autoload.php'和相关use语句(如有必要)。
创建您的源和目标对象。此示例使用CSV源和PDO(数据库)目标。
$ csvSource = new CSVSource ( ' users.csv ' );
$ pdoDestination = new PDODestination ( new PDO ( ' mysql:dbname=test-database;host=127.0.0.1 ' , ' root ' , ' password ' ), ' users ' ); $ migrator = new Migrator ;
$ migrator -> setSource ( $ csvSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> withProgressBar ()
-> migrate ();php user-csv-import.php ,并获得一个不错的进度栏。有关可用来源和目标对象以及更高级用法的更多信息,请参见下面的部分。
每个UXDM迁移都需要一个源对象和至少一个目标对象。这些决定了读取和编写数据的位置和方式。 UXDM软件包可与各种来源和目标对象一起使用,包括以下内容。
其中一些内置在核心UXDM软件包中,而另一些则是单独的软件包。
源和目标对象可用于任何组合。数据可以从CSV迁移并插入数据库,就像可以将数据从数据库迁移到CSV一样容易。
您还可以在同一迁移中使用类似的源和目标对象。例如,UXDM的常见用途是使用PDO源和PDO目的地将数据从一个数据库传输到另一个数据库。
请参阅“来源和目的地”页面,以获取更多资源和目的地,以及有关其使用情况的详细文档。
数据库UXDM迁移的基本数据库的一个示例如下所示。
$ pdoSource = new PDOSource ( new PDO ( ' mysql:dbname=old-test;host=127.0.0.1 ' , ' root ' , ' password123 ' ), ' users ' );
$ pdoDestination = new PDODestination ( new PDO ( ' mysql:dbname=new-test;host=127.0.0.1 ' , ' root ' , ' password456 ' ), ' new_users ' );
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> withProgressBar ()
-> migrate ();此迁移将将id , email和name字段从old-test数据库中的users表移动到new-test数据库中的new_users表,从而替换了使用相同id (密钥字段)的任何现有记录。
您可以使用UXDM验证源数据。如果验证通过迁移而失败,则迁移将停止,并将抛弃ValidationException 。但是,如果调用->validateBeforeMigrating() ,则将在迁移开始之前先验证所有数据行。
下面的代码显示了如何验证各个字段。
$ pdoSource = new PDOSource ( new PDO ( ' mysql:dbname=old-test;host=127.0.0.1 ' , ' root ' , ' password123 ' ), ' users ' );
$ pdoDestination = new PDODestination ( new PDO ( ' mysql:dbname=new-test;host=127.0.0.1 ' , ' root ' , ' password456 ' ), ' new_users ' );
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setValidationRules ([
' id ' => [ new Required (), new IsNumeric ()],
' email ' => [ new Required (), new IsString (), new IsEmail ()],
' name ' => [ new Required (), new IsString ()],
])
// ->validateBeforeMigrating()
-> setKeyFields ([ ' id ' ])
-> withProgressBar ()
-> migrate ();此迁移将验证源数据与定义的验证规则匹配。
UXDM使用Omega验证器软件包。有关所有可用验证规则,请参见其文档。
此示例显示了UXDM如何从源到目标映射字段名称。
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> setFieldMap ([ ' name ' => ' full_name ' ])
-> withProgressBar ()
-> migrate ();此迁移将将数据从源name字段移动到目标full_name字段,同时仍正常移动id和email字段。
有时,您想要从源到目的地需求转换的数据。这可能是在更改现有的数据项目,添加新数据项或删除您不需要的项目。
UXDM允许您创建一个或多个变压器对象,并将它们添加到迁移中。请参阅以下示例,示例如何使用变压器来操纵您的数据。
此示例显示了如何在迁移过程中转换现有数据项。
class NameCaseTransformer implements TransformerInterface
{
public function transform ( DataRow $ dataRow ): void
{
$ nameDataItem = $ dataRow -> getDataItemByFieldName ( ' name ' );
$ nameDataItem -> value = ucwords ( strtolower ( $ nameDataItem -> value ));
}
}
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> addTransformer ( new NameCaseTransformer ())
-> withProgressBar ()
-> migrate ();此迁移将确保所有名称字段都具有一致的情况。
此示例显示了在迁移发生时如何添加新数据项。
class AddRandomNumberTransformer implements TransformerInterface
{
public function transform ( DataRow & $ dataRow ): void
{
$ dataRow -> addDataItem ( new DataItem ( ' random_number ' , rand ( 1 , 1000 )));
}
}
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> addTransformer ( new AddRandomNumberTransformer ())
-> withProgressBar ()
-> migrate ();此迁移将为每一行数据添加一个随机数,称为random_number的字段。然后,这将与其他字段一起迁移到目标数据库。
此示例演示了如何从数据行中删除数据项。如果您想使用其值,但实际上不将其迁移到目的地,您可能希望这样做。
class EmailToHashTransformer implements TransformerInterface
{
public function transform ( DataRow $ dataRow ): void
{
$ emailDataItem = $ dataRow -> getDataItemByFieldName ( ' email ' );
$ dataRow -> addDataItem ( new DataItem ( ' email_hash ' , md5 ( $ emailDataItem -> value )));
$ dataRow -> removeDataItem ( $ emailDataItem );
}
}
$ migrator = new Migrator ;
$ migrator -> setSource ( $ pdoSource )
-> setDestination ( $ pdoDestination )
-> setFieldsToMigrate ([ ' id ' , ' email ' , ' name ' ])
-> setKeyFields ([ ' id ' ])
-> addTransformer ( new EmailToHashTransformer ())
-> withProgressBar ()
-> migrate ();此迁移从源中的email字段中获取数据,创建一个新的email_hash数据项,其中包含电子邮件地址的MD5,然后删除原始的email数据项。然后,此新的email_hash将与其他字段一起迁移到目标数据库,不包括已删除的email字段。