In web development, managing large datasets can be a challenge, especially when dealing with file imports. Laravel Excel is a powerful package that simplifies Excel and CSV file handling in Laravel. Coupled with Laravel’s queue system, you can efficiently manage these imports without affecting the performance of your application. This blog will guide you through the steps to implement queue jobs for importing data using Laravel Excel in Laravel 11.
1. Create a project:
Now, open a terminal and run this command:
composer create-project laravel/laravel excel-import-laravel
After Setup Project:
cd excel-import-laravel
2. Database Configuration:
Configuring database credentials for the Laravel application is essential. Simply update the .env file located in the root directory of the application:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=your_db_name DB_USERNAME=your_db_username DB_PASSWORD=your_db_password
Migrate the database using the following command:
php artisan migrate
3. Install the required packages: –
Install the maatwebsite/excel package via Composer:
Now, open terminal
composer require maatwebsite/excel
4. Generate Migration and Model: –
Now, open terminal
php artisan make:model Product -m
<?php use IlluminateDatabaseMigrationsMigration; use IlluminateDatabaseSchemaBlueprint; use IlluminateSupportFacadesSchema; return new class extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->text('description')->nullable(); $table->decimal('price', 8, 2); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('products'); } };
To begin, open your ‘app/Models/Product.php‘ file and make the necessary modifications to the existing code.
<?php namespace AppModels; use IlluminateDatabaseEloquentModel; class Product extends Model { protected $fillable = ['name', 'description', 'price']; }
5. Create an Excel Import Job:
Next, create a new job for importing Excel data. You can generate a new job using the Artisan command:
Here’s the command:
php artisan make:job ImportExcelJob
This will create a new job class in the app/Jobs directory. Open the ImportExcelJob class and update it with the following code:
<?php
namespace AppJobs;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
use MaatwebsiteExcelFacadesExcel;
use AppModelsProduct;
class ImportExcelJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $filePath;
public function __construct($filePath)
{
$this->filePath = $filePath;
}
public function handle()
{
$rows = Excel::toArray([], $this->filePath);
$headingRow = $rows[0][0]; // Get the heading row
$data = array_slice($rows[0], 1);
foreach ($data as $row) {
$rowData = array_combine($headingRow, $row);
$product = new Product([
'name' => $rowData['Name'],
'description' => $rowData['Description'],
'price' => $rowData['Price'],
]);
// Save the product
$product->save();
}
}
}
6. Generate the Controller :-
First, create the controller using the Artisan command:
php artisan make:controller ExcelController
Open the newly created ExcelController located in the app/Http/Controllers directory and add methods to handle file uploads and dispatching the import job. Here’s an example implementation:
<?php
namespace AppHttpControllers;
use AppJobsImportExcelJob;
use IlluminateHttpRequest;
class ExcelController extends Controller
{
/**
* Display the Excel import form.
*
* @return IlluminateViewView
*/
public function index()
{
return view('import');
}
/**
* Handle the Excel import request.
*
* @param IlluminateHttpRequest $request
* @return IlluminateHttpRedirectResponse
*/
public function import(Request $request)
{
$request->validate([
'excel_file' => 'required|file|mimes:xlsx,xls',
]);
$file = $request->file('excel_file');
$filePath = $file->getPathname();
ImportExcelJob::dispatch($filePath);
return redirect()->back()->with('success', 'Excel import job has been initiated.');
}
}
To begin, open your ‘resources/views/layouts/app.blade.php’ file and make the necessary modifications to the existing code.
<!DOCTYPE html>
<html>
<head>
<title>Laravel 11 Product Import</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
</head>
<body>
<div class="container">
@yield('content')
</div>
</body>
</html>
create `resources/views/import.blade.php`
@extends('layouts.app')
@section('content')
<div class="card mt-5">
<h3 class="card-header">Product Import</h3>
<div class="card-body">
@session('success')
<div class="alert alert-success" role="alert">
{{ $value }}
</div>
@endsession
@if ($errors->any())
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('excel.import') }}" method="POST" enctype="multipart/form-data">
@csrf
<input type="file" name="excel_file" required>
<button class="btn btn-success" type="submit">Import Excel</button>
</form>
</div>
</div>
@endsection
7. Add Routes:
To begin, open your ‘routes/web.php’ file and make the necessary modifications to the existing code.
<?php
use AppHttpControllersExcelController;
use IlluminateSupportFacadesRoute;
Route::get('/', [ExcelController::class, 'index'])->name('excel.index');
Route::post('/import-excel', [ExcelController::class, 'import'])->name('excel.import');
8. Run the Laravel Project:
Run the following command:
php artisan serve
Now, open your web browser and navigate to the provided URL to view the application output.
localhost:8000
Finally, you need to ensure that Laravel’s queue workers are running and processing the jobs. You can start a worker using the following Artisan command:
php artisan queue:work
Conclusion:-
In conclusion, implementing Excel imports with Laravel Excel and queue jobs in Laravel 11 streamlines data management tasks efficiently. This setup ensures seamless handling of large datasets without compromising application performance, enhancing overall user experience and productivity.
Thank You…