https://repository-images.githubusercontent.com/606438103/ca84c3ad-ec7a-4395-835b-4d4fcfa35d6e
Data Migrator
Data Migrator is a PHP/Laravel package that helps you migrate data from one model to another, even if they have
different
structures.
It’s especially useful when you’re migrating data between models with different database schemas.
Installation
You can install the package via composer:
composer require oguzhankrcb/datamigrator
Usage
Transforming Data
To transform data from one model to another, use the transformData
method. This method takes two arrays:
$toModelPrototype
and $fromModel
.
$toModelPrototype
should be an array that describes the structure of the new model, with the keys being the names of
the
new fields, and the values being the names of the fields from the old model that the new fields should be based on. For
example:
$toModelPrototype = [ 'id' => '[id]', 'unique_id' => '[unique_number.id]', 'name' => '[data->name]', 'categories' => [ 'first_category' => '[data->categories->category_2]', 'second_category' => '[data->categories->category_3]', ], 'alias_with_item_code' => '[data->alias][data->item->code]', 'alias' => '[data->alias]', 'item_code' => '[data->item->code]', 'status' => '[data->status]', ];
$fromModel
should be an array that represents a single row of data from the old model, with the keys being the names
of the fields from the old model, and the values being the actual values.
For example:
$fromModel = [ 'id' => 1, 'unique_number' => 'lxAxmUlkfc', 'data' => [ 'name' => 'John Doe', 'alias' => 'JD', 'categories' => [ 'category_1' => 'Bronze', 'category_2' => 'Silver', 'category_3' => 'Gold', ], 'item' => [ 'code' => 196854, ], 'status' => true, ], ];
Here’s an example of how to use transformData
:
use Oguzhankrcb\DataMigrator\Facades\DataMigrator; $newData = DataMigrator::transformData($toModelPrototype, $fromModel);
The $newData
array will contain the transformed data, with the keys being the names of the new fields, and the values
being the corresponding values from the old model.
Output Example:
[ 'id' => 1, 'unique_id' => 'lxAxmUlkfc1', 'name' => 'John Doe', 'categories' => [ 'first_category' => 'Silver', 'second_category' => 'Gold', ], 'alias_with_item_code' => 'JD196854', 'alias' => 'JD', 'item_code' => '196854', 'status' => true, ]
Transferring Data
To transfer all data from one model to another, use the transferAllDataFromModelToModel
method. This method takes
three
arguments: $transferToModel
, $toModelPrototype
, and $transferFromModel
.
$transferToModel
should be the fully qualified class name of the model you want to transfer the data to. For example:
$transferToModel = \App\Models\User::class;
$toModelPrototype
should be the same array you used with transformData
.
$transferFromModel
should be the fully qualified class name of the model you want to transfer the data from. For
example:
$transferFromModel = \App\Models\LegacyUser::class;
Here’s an example of how to use transferAllDataFromModelToModel
:
use App\Models\Order; use App\Models\Invoice; use Oguzhankrcb\DataMigrator\Facades\DataMigrator; // Define the fields to transfer from Order to Invoice $toModelPrototype = [ 'invoice_number' => '[order_number]', 'customer_name' => '[customer->name]', 'customer_email' => '[customer->email]', 'total_amount' => '[amount]', 'total_amount_with_currency' => '[amount]€', ]; // Transfer the data from Order to Invoice DataMigrator::transferAllDataFromModelToModel(Invoice::class, $toModelPrototype, Order::class);
In this example, we define the fields we want to transfer from the Order
model to the Invoice
model using the
$toModelPrototype
array. Then we call the
transferAllDataFromModelToModel
method, passing in the Invoice
and Order
models and the $toModelPrototype
array.
This method will transfer all the data from the Order
model to the Invoice
model, creating a new Invoice
model for
each
Order
model in the database.
If you want to transfer only one model data to another model you can use transferDataModelToModel
method
only difference from the transferAllDataFromModelToModel
method is this method only transfers one model not all
models.
Here’s an example of how to use transferDataModelToModel
:
use App\Models\Order; use App\Models\Invoice; use Oguzhankrcb\DataMigrator\Facades\DataMigrator; // Define the fields to transfer from Order to Invoice $toModelPrototype = [ 'invoice_number' => '[order_number]', 'customer_name' => '[customer->name]', 'customer_email' => '[customer->email]', 'total_amount' => '[amount]', 'total_amount_with_currency' => '[amount]€', ]; $orderInstance = Order::find(1); // Transfer the data from Order to Invoice $transferedModel = DataMigrator::transferDataModelToModel(Invoice::class, $toModelPrototype, $orderInstance);
Testing
Changelog
Please see CHANGELOG for more information on what has changed recently.
Contributing
Contributions are welcome! If you find any bugs or issues,
please open a new issue or submit a pull request.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
License
The DataMigrator package is open-source software licensed under the MIT license.
Laravel News Links