Installation Add the package via Composer:
composer require ddeboer/data-import
Publish the config file (if needed):
php artisan vendor:publish --provider="Ddeboer\DataImport\DataImportServiceProvider"
Basic Usage Import a CSV file:
use Ddeboer\DataImport\Reader\CsvReader;
use Ddeboer\DataImport\Reader\Header\HeaderStyle;
$reader = new CsvReader('path/to/file.csv', 'r');
$reader->setHeaderStyle(HeaderStyle::NAMED);
$reader->setHeaderRow(1); // Skip header row if needed
foreach ($reader as $record) {
// Process each record (array of data)
}
First Export Export data to CSV:
use Ddeboer\DataImport\Writer\CsvWriter;
$writer = new CsvWriter('path/to/output.csv', 'w');
$writer->addRow(['Name', 'Email']); // Header
$writer->addRow(['John Doe', 'john@example.com']);
$writer->close();
Bulk Data Import
Use BatchReader for large files to avoid memory issues:
$reader = new BatchReader(new CsvReader('large_file.csv'), 1000);
foreach ($reader as $batch) {
// Process batch (array of records)
}
Mapping Fields to Eloquent Models
Combine with Laravel’s Model::create() or Model::updateOrCreate():
foreach ($reader as $record) {
User::updateOrCreate(
['email' => $record['email']],
['name' => $record['name']]
);
}
Validation During Import
Use Laravel’s Validator inside the loop:
$validator = Validator::make($record, [
'email' => 'required|email',
'name' => 'required|string',
]);
if ($validator->fails()) {
// Log errors or skip invalid records
}
Exporting Eloquent Collections Convert a collection to CSV:
$users = User::all();
$writer = new CsvWriter('users.csv', 'w');
$writer->addRow(['Name', 'Email']); // Header
$users->each(fn ($user) => $writer->addRow([
$user->name,
$user->email,
]));
$writer->close();
Handling Different Formats
ExcelReader/ExcelWriter (requires phpoffice/phpexcel).JsonReader/JsonWriter for structured data.XmlReader/XmlWriter for hierarchical data.Chunking for Large Exports
Use StreamWriter to avoid memory overload:
$writer = new StreamWriter(new CsvWriter('large_export.csv', 'w'));
foreach ($users->chunk(1000) as $chunk) {
$chunk->each(fn ($user) => $writer->addRow([$user->name, $user->email]));
}
$writer->close();
Memory Issues
CsvReader.BatchReader or StreamWriter for chunked processing.memory_get_usage() in loops.Encoding Problems
CsvReader:
$reader = new CsvReader('file.csv', 'r');
$reader->setEncoding('ISO-8859-1');
Header Mismatches
HeaderStyle::FIRST_ROW and manually map fields:
$reader->setHeaderStyle(HeaderStyle::FIRST_ROW);
$mappedRecord = [
'name' => $record['Name'], // Case-sensitive!
'email' => $record['Email'],
];
File Locking
$writer->close() after finishing.Deprecated Methods
setDelimiter()) may behave unexpectedly in newer PHP versions.setEnclosure().$invalidRecords = [];
foreach ($reader as $record) {
if (!$validator->passes()) {
$invalidRecords[] = $record;
continue;
}
}
file_put_contents('invalid_records.log', json_encode($invalidRecords));
getHeaders(): Inspect column names dynamically:
print_r($reader->getHeaders());
Custom Readers/Writers
Extend AbstractReader or AbstractWriter for proprietary formats:
class JsonApiReader extends AbstractReader {
public function read() { /* Custom logic */ }
}
Event Hooks
Trigger events during import/export (e.g., import.start, record.processed):
event(new DataImportStarted($reader));
Laravel Service Provider Bind readers/writers to the container for dependency injection:
$this->app->bind(CsvReader::class, function () {
return new CsvReader('file.csv');
});
Queue Jobs for Large Imports Offload processing to queues:
foreach ($reader as $record) {
ImportRecordJob::dispatch($record);
}
How can I help you explore Laravel packages today?