tutorial laravel

Tutorial Laravel Import Excel ke Database

Tutorial Laravel Import Excel – Pada artikel kali ini kita akan membahas tentang import excel ke database menggunakan laravel. Setelah sebelumnya kita mencoba meng-export data dengan laravel (https://soft-gain.com/2020/06/10/tutorial-export-excel-laravel-aplikasi-inventory-part-6/), kali ini kita akan mencoba kebalikannya, yaitu import data dari excel ke database.

Pertama tambahkan baris ini pada file route kita :

Route::post('/barang/import', 'sg_barang@import');

Selanjutnya tambahkan fungsi import pada controller sg_barang :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\sg_barang as model;
use Excel;
use Auth;

class sg_barang extends Controller
{
    public function index(){
    	$barangs = model::with('getUpdatedBy')->get();

    	return view('barang.table',compact('barangs'));
    }

    public function create(){
    	return view('barang.form');
    }

    public function store(Request $request){
    	model::create($request->all());

    	return redirect('barang');
    }

    public function show(){
    	//
    }

    public function edit($id){
    	$editForm = true;
    	$barangs = model::find($id);

    	return view('barang.form',compact('barangs','editForm'));
    }

    public function update(Request $request, $id){
    	$data = $request->except('_method', '_token');
    	model::where('id',$id)->update($data);

    	return redirect('barang');
    }

    public function destroy($id){
    	model::destroy($id);

    	return redirect('barang');
    }

    public function import(Request $request){ // <--- FUNGSI INI
        Excel::load($request->file('import')->getRealPath(), function ($reader){
            foreach ($reader->toArray() as $key => $row) {
                $data['nama_barang'] = (isset($row['nama_barang']) && $row['nama_barang']!='') ? $row['nama_barang'] : null;
                $data['jumlah_barang'] = (isset($row['jumlah_barang']) && $row['jumlah_barang']!='') ? $row['jumlah_barang'] : null;
                $data['keterangan'] = (isset($row['keterangan']) && $row['keterangan']!='') ? $row['keterangan'] : null;
                $data['updated_by'] = Auth::user()->id;
                model::create($data);
            }
        });

        return redirect('barang');
    }
}

Berikut ini adalah sedikit penjelasan pada fungsi import, pertama request yang dikirim dari client akan di handle oleh fungsi load, lalu dengan memanfaatkan anonymous kita simpan data yang sudah kita terima dari client ke dalam bentuk array dalam variabel $reader. Lalu kita akan melakukan looping pada variabel reader dan kita akan mengambil perbaris data berdasarkan nama pada header kolomnya, perlu diperhatikan penamaan pada kolom header akan diubah menjadi huruf kecil dan karakter spasi akan diganti dengan karakter underscore (contoh : Nama Barang = nama_barang). Lalu hasil looping tadi akan kita simpan pada database dan kita response kita kembalikan pada client.

Lalu tambahkan potongan source code ini pada file sg_barang/table.blade.php :

<a class="btn btn-success toggle-import-form" href="javascript:;">
                            Import from Excel
                        </a>
                        {!! Form::model('', ['url' => url('/barang/import'), 'method' => 'post', 'enctype'=>'multipart/form-data', 'id'=>'import-form']) !!}
                            {{ csrf_field() }}
                            </br>
                            <div class="form-group col-xs-12 col-lg-6">
                                <a class="btn btn-primary" href="{{ url('csv-template/import-template.csv') }}" download>
                                    Download Import Template
                                </a>
                            </div>
                            <div class="form-group col-xs-12 col-lg-12">
                                {{ Form::file('import', ['class' => 'form-control', 'required']) }}
                            </div>
                            <div class="form-group col-xs-12 col-lg-12">
                                <button type="submit" class="btn btn-primary">Submit</button>
                            </div>
{!! Form::close() !!}

Di file ini juga kita akan menambahkan sedikit animasi untuk menampilkan form import (ini di buat hanya untuk mempercantik tampilan saja, tidak ada pengaruhnya dengan fungsi import itu sendiri). Kita akan menambahkan potongan source ini pada bagian paling bawah dari file :

@push('scripts')
    <script type="text/javascript">
        $(document).ready(function() {
            $('#import-form').hide();

            $('.toggle-import-form').click(function(){
                $('#import-form').slideToggle();
            });
        });
    </script>
@endpush

Lalu pada file layouts/app.blade.php kita tambahkan potongan source code ini di bagian paling akhir setelah semua tag javascript di deklarasikan :

@stack('scripts')

Penggunaan dari @push dan @stack ini sendiri adalah untuk menempatkan beberapa blok konten dari script yang kita deklarasikan di dalam @push ke dalam bagian dimana @stack kita deklarasikan. Sebagai contoh pada file table.blade.php kita bisa menggunakan beberapa perintah jquery tanpa harus mendeklarasikan jquery pada file tersebut, hal itu bisa kita lakukan karena kita menaruh perintah jquery itu di dalam @push lalu @stack pada file app.blade.php kita tempatkan persis dibawah setelah library jquery kita deklarasikan.

Terakhir kita juga akan menambahkan sebuah folder baru dengan nama csv-template, yang di dalamnya akan kita taruh file csv yang akan kita gunakan sebagai template untuk import data (root-project/public/csv-template/import-template.csv). Dan seperti ini lah kurang lebih tampilan form untuk import excel yang sudah di buat :

Tutorial Laravel Import Excel
Import Excel

Untuk full source-nya seperti biasa bisa di ambil dari repo saya (https://github.com/ImmanuelJL/belajar-laravel), silahkan di ambil dari cabang aplikasi-stok-barang. Terima kasih.

Leave a Reply

Your email address will not be published. Required fields are marked *