Pendahuluan
Bagaimana jika kita memiliki data banyak di file excel dan kita ingin memindahkan ke dalam database kita? Laravel sendiri sudah menyediakan library untuk mengatasi hal tersebut. Anda dapat mengecek di situs laravel excel.
Pada materi kali ini kita akan menggunakan library excel untuk melakukan upload data dari excel ke database. Namun sebelumnya kita perlu mempersiapkan beberapa bahan. Silahkan ikuti tutorial dibawah ini
Persiapan
1. Sebelum memulai membuat projek, mari kita persiapkan terlebih dahulu data yang akan kita upload nantinya. Data tersebut. Silahkan anda buat sebuah data di Microsoft Excel yang terdiri dari 4 field (No, Nama, Email dan passwor) seperti berikut:
No | Nama | PASSWORD | |
---|---|---|---|
1 | Admin | admin@gmail.com | admin |
2 | USer | user@gmail.com | user |
Tabel tersebut akan kita upload ke dalam tabel database yang bernama users nantinya. Jadi field tersebut kita sesuaikan saja dengan field yang secara otomatis diubat oleh laravel.
2. Instal Laravel 11 anda, dan pastikan anda sudah melakukan konfigurasi pada .env untuk menghubungkan ke database. Jangan lupa untuk melakukan migrate. Anda dapat melihat tutorialnya di " Cara Instal Laravel ", sedangkan untuk konfigurasi dan migrate dapat anda baca tutorial "Membuat Database dan Konfigurasi .env". Latihan kali ini kita memberi nama projek dengan nama "LatihanLaravel".
3. Buat User Interface untuk upload file. Anda dapat ketikkan perintah berikut di terminal:
php artisan make:view Upload.
Buka root projek Resources => Views => Upload.blade.php dan tambahkan script berikut sebagai UI nantinya:
<!doctype html><html lang="en"><head><title>Upload File Excel</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"></head><body><div class="container mt-5 border p-5"><form method="post" action="/upload-file" enctype="multipart/form-data">@csrf<div class="form-label">Pilih File</div><input type="file" name="upload_file" class="form-control-file"><button type="submit" class="btn btn-info ">Upload</button></form></div></body></html>
Sekarang buka Routes => web.php dan buat jalur untuk mengakses UI yang telah kita buat tadi:
Route::get('/upload', function () {return view('Upload');});
Silahkan jalankan projek anda dengan mengetikkan perintah berikut di terminal:
php artisan serve
selanjutnya buka browser dan ketikkan di url perintah berikut:
http://127.0.0.1:8000/upload
Berikut bentuk UI yang telah kita desain tadi:
4. Sekarang anda buat sebuah controller baru dengan nama USerController.php dengan mengetikkan perintah berikut pada terminal
php artisan make:controller USerController
Buatlah method baru di USerController.php dengan nama "upload_file()" seperti berikut:
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class USerController extends Controller{public function upload_file(Request $request){dd($request->all());}}
Perintah dd()$request->() berfungsi untuk mengecek apakah data sudah dibaca atau belum. Jika terbaca maka akan tampil di browser seperti berikut:
array:2 [▼ // app\Http\Controllers\USerController.php:11 "_token" => "StB1mdp6tQZ7WTudWRdAO6J0zgEyTmGuq0FSzXRR" "upload_file" => { UploadedFile#242 ▶} ]
5. Sekarang kita akan memasangkan library untuk mengakses file excel.
Buka projek anda tadi di VsCode, atau anda dapat menggunakan terminal CMD, dengan masuk ke "laragon/www/latihanLaravel". Kita akan memasang library Excel di projek kita tadi. Ketikkan perintah berikut pada terminal:
composer require maatwebsite/excel
Tunggu proses downloand sampai selesai.
6. Setelah selesai download library excel, selanjutnya kita buat file import dengan mengetikkan perintah berikut pada terminal:
php artisan make:import UserImport
Perintah tersebut merupakan perintah untuk membuat folder import di App dan satu buah file bermana UserImport. Anda dapat melihat file tersebut di App =>Import => UserImport.
7. Mari kita akses file USerImport melewati USerController terlebih dahulu. Kembali ke file UserController.php dan edit script seperti berikut:
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;use App\Imports\UserImport; // Mengakses UserImportuse Excel; //Libary untuk mengakses Excelclass USerController extends Controller{public function upload_file(Request $request){//dd($request->all());Excel::import(new UserImport, $request->file('upload_file'));}}
Kita akses terlebih dahulu 2 buah library dengan menambahkan
use App\Imports\UserImport; // Mengakses UserImport
use Excel; //Libary untuk mengakses Excel
Perhatikan pada Objek import, terdapat perintah $request->file(upload_file). Upload_file merupakan nama dari form input yang kita buat di halaman UI sebelumnya. Jadi nama ini harus sama dengan nama yang dikirim dari UI.8. Buka root App => Import => UserImport. Kita akan coba mengakses data dari excel dengan melakukan Dump and Die (dd). Silahkan tambahkan script berikut:
<?phpnamespace App\Imports;use Illuminate\Support\Collection;use Maatwebsite\Excel\Concerns\ToCollection;class UserImport implements ToCollection{/*** @param Collection $collection*/public function collection(Collection $collection){dd($collection);}}
Coba jalankan projek anda. Jika semua langkah benar maka akan tampil seperti berikut:
Illuminate\Support\Collection {#453 ▼ // app\Imports\UserImport.php:15 #items: array:3 [▼ 0 => { Collection#445 ▶} 1 => { Collection#447 ▶} 2 => { Collection#451 ▼ #items: array:3 [▼ 0 => "user" 1 => "user@gmail.com" 2 => "user" ] #escapeWhenCastingToString: false } ] #escapeWhenCastingToString: false }
NB. Centang tanda segitiga untuk melihat item yang di kirim.
8. Buat method ToModel untuk menyimpan file excel ke database. Anda dapat menambahkan perintah berikut di UserImport:
....use Maatwebsite\Excel\Concerns\ToModel;use App\Models\User;use Hash;class UserImport implements ToCollection, ToModel // Tambahkan class ToModel..............
Kemudain buatlah method ToModel. Berikut Scriptnya:
<?phpnamespace App\Imports;use Illuminate\Support\Collection;use Maatwebsite\Excel\Concerns\ToCollection;use Maatwebsite\Excel\Concerns\ToModel;use App\Models\User;use Hash;class UserImport implements ToCollection, ToModel{private $cuttent = 0;/*** @param Collection $collection*/public function collection(Collection $collection){// dd($collection);}public function model(array $row){$this->cuttent++;if ($this->cuttent > 1) {$count = User::where('email', '=', $row[2])->count();if (empty($count)) {$data = (['name' => $row[1],'email' => $row[2],'password' => Hash::make($row[3])]);User::create($data);}}}}
Perintah atau variabel $cuttent merupakan script yang menentukan di row berapa record akan di upload. Logika if ($this->cuttent >1) meminta sistim membaca record dari row ke dua di dalam excel. Artinya pada row pertama (Header Tabel) tidak akan di baca oleh sistim.
Sedangkan perintah $count = User::where('email', '=', $row[2])->count(); meminta sistim agar membaca email yang telah tersimpan di dalam database. Jika ada email yang sama maka data baru tidak akan diupload.
Terakhir Jalankan program dan coba upload file excel yang telah di buat tadi.