This post is also available in:
English
To Collection
Langkah-langkah untuk melakukan import ini mirip dengan langkah-langkah pada saat melakukan export. Buatlah direktori Imports di dalam direktori app. Kemudian buatlah sebuah file (di sini saya menggunakan nama PesertaImportCollection.php) sesuai dengan nama model yang saya gunakan yaitu model Peserta. Berikut ini adalah isi dari file tersebut :
<?php
namespace App\Imports;
use App\Model\Peserta;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
class PesertaImportCollection implements ToCollection
{
public function collection(Collection $rows)
{
foreach ($rows as $row)
{
if ($row[4] == "Belum Verifikasi"){
$status = 0;
} else {
$status = 1;
}
Peserta::create([
'NIK' => $row[1],
'nama' => $row[2],
'bagian' => $row[3],
'hadiah' => $row[0],
'status' => $status,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
}
}
}
Cara kerja dari mode To Collection ini adalah dengan membaca file excel yang diupload sebagai keseluruhan baris yang disimpan dalam variabel $rows. Variabel ini kemudian dibaca baris per baris dengan menggunakan perintah foreach dan kemudian melakukan insert data dengan menggunakan model Peserta. Variabel $row[0] akan mengambil data pada kolom pertama dan seterusnya. Anda juga dapat memodifikasi data terlebih dahulu seperti yang saya lakukan pada field status. Untuk menggunakan mode To Collection ini kita perlu menggunakan use Maatwebsite\Excel\Concerns\ToCollection; dan juga implements ToCollection.
To Model
Cara kedua ini adalah cara yang biasanya saya gunakan. Sama dengan cara pertama tadi. anda juga perlu membuat satu file import di dalam direktori app/Imports. Dalam contoh ini saya membuat file dengan nama PesertaImport.php untuk membedakan dengan cara yang pertama tadi.
<?php
namespace App\Imports;
use App\Model\Peserta;
use Maatwebsite\Excel\Concerns\ToModel;
class PesertaImport implements ToModel
{
public function model(array $row)
{
if ($row[4] == "Belum Verifikasi"){
$status = 0;
} else {
$status = 1;
}
return new Peserta([
'NIK' => $row[1],
'nama' => $row[2],
'bagian' => $row[3],
'hadiah' => $row[0],
'status' => $status,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
}
}
Kode di atas adalah isi dari file PesertaImport.php. Yang membedakan dengan mode To Collection adalah dengan cara ini file excel akan dibaca langsung secara perbaris, jadi kita tidak perlu melakukan proses foreach terlebih dahulu. Ketentuan lainnya masih sama yaitu index 0 untuk membaca kolom pertama dan seterusnya.
To Model dengan Header
Cara ini digunakan jika file excel yang anda upload memiliki header. Sebenarnya anda bisa saja menghapus secara manual header tersebut baru melakukan upload. Namun jika anda tidak mau melakukan hal tersebut maka anda dapat menggunakan cara ini.
<?php
namespace App\Imports;
use App\Model\Peserta;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
class PesertaImportHeader implements ToModel, WithHeadingRow
{
public function model(array $row)
{
if ($row['status'] == "Belum Verifikasi"){
$status = 0;
} else {
$status = 1;
}
return new Peserta([
'NIK' => $row['nik'],
'nama' => $row['nama'],
'bagian' => $row['bagian'],
'hadiah' => $row['hadiah'],
'status' => $status,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
}
}
Caranya masih mirip dengan cara-cara sebelumnya. Jangan lupa untuk menambahkan use Maatwebsite\Excel\Concerns\WithHeadingRow; dan juga implements WithHeadingRow. Dengan cara ini index yang digunakan pada variabel $row adalah nama kolom header pada file excel yang anda upload. Dan jangan lupa untuk menggunakan huruf kecil semua pada saat melakukan penulisan index walaupun header pada file excel menggunakan huruf besar. Saya tidak tahu apakah ada setting atau pengaturan yang perlu dilakukan untuk mengatasi hal tersebut.
Controller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers;
use App\Imports\PesertaImportCollection;
use App\Imports\PesertaImport;
use App\Imports\PesertaImportHeader;
use Excel;
class ExcelController extends Controller {
public function import(Request $request)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
// Excel::import(new PesertaImportCollection, $file);
// Excel::import(new PesertaImport, $file);
Excel::import(new PesertaImportHeader, $file);
return redirect('import/excel');
}
}
}