5 Cara Menyisipkan Data (Insert Row) dengan Eloquent

Yugo
Laravel Indonesia
Published in
5 min readJul 17, 2017

Menggunakan ORM Eloquent dalam pengembangan, memberikan pemrogram (programmer) beberapa kelebihan. Seperti kecepatan dalam pengembangan, keamanan dengan filter SQL Injection, sampai dengan kemudahan penggunaan untuk data yang saling berkaitan.

Jika kalian telusuri operasi CRUD menggunakan Laravel, bisa jadi kalian temui beberapa cara untuk menyisipkan baris pada pangkalan data. Setidaknya, ada lima cara yang bisa diimplementasikan dalam aplikasi. Semua cara yang kalian lihat, pada dasarnya sesuai dengan aturan yang diterapkan dalam pengembangan aplikasi berbasis Laravel. Hanya saja, penggunaan beberapa cara tersebut sangat tergantung akan situasi dan kondisi alur aplikasi.

Cara apa saja yang bisa kalian gunakan untuk menyisipkan baris (insert row) pada pangkalan data?

Sebelumnya, dalam contoh kasus akan menggunakan model yang sudah tersedia dalam paket instalasi Laravel 5, yaitu App\User.php. Adapun untuk struktur tabelnya berbentuk seperti di bawah.

+----------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(191) | NO | | NULL | |
| email | varchar(191) | NO | UNI | NULL | |
| password | varchar(191) | NO | | NULL | |
| remember_token | varchar(100) | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+----------------+------------------+------+-----+---------+----------------+

Object Assign dari Model

Cara pertama umumnya sering dilihat pada tutorial Laravel kebanyakan, yaitu assign sebuah value pada objek dari instance model. Dalam kasus ini ialah model App\User.php.

Hal yang pertama dilakukan adalah membuat instance dari class User, kemudian menampung objeknya pada sebuah variabel.

$user = new \App\User;

Setelah objek didapat, kalian bisa meng-assign sebuah nilai pada tiap-tiap properti objek tersebut. Yang mana, tiap properti merupakan refleksi dari kolom di tabel model bersangkutan. Lengkapnya dapat dilihat pada potongan skrip di bawah.

$user = new \App\User;

$user->name = 'Laravel Indonesia';
$user->email = 'mail@laravel.web.id';
$user->password = bcrypt('secret');

$user->save();

Di baris terakhir, jangan lupa menggunakan method save() untuk memroses data agar disimpan ke dalam pangkalan data.

Menggunakan Method “Create”

Cara kedua ini jauh lebih singkat dan praktis. Kalian cukup melempar argumen pertama berupa array berpasangan. Yang mana key-nya merupakan nama atribut model (refleksi kolom di tabel), sedangkan value-nya bersifat dinamis yang ditentukan oleh pemrogram. Sebagai contoh:

$user = \App\User::create([
'name' => 'Laravel Indonesia',
'email' => 'mail@laravel.web.id',
'password' => bcrypt('secret')
]);

Cara lain yang lebih singkat, bisa kalian temui ketika membangun form dengan nama input yang sama dengan nama atribut. Saat penyisipan data, kalian hanya perlu menuliskannya sebagai berikut:

$user = \App\User::create(request()->only('name', 'email'));

Perlu diperhatikan, ketika menggunakan method create(), kalian harus menambahkan properti dengan nama $fillable pada model bersangkutan. Isinya sendiri berupa array dengan atribut yang merupakan refleksi dari kolom di tabel users.

$fillable = [
'name',
'email',
'password',
'remember_token',
];

Setiap ada penambahan kolom di tabel users, kalian juga harus menambahkan atribut yang sama pada properti $fillable untuk menghindari pesan kesalahan Mass Assignment Exception saat menyisipkan data.

Menggunakan Method “Insert”

Penggunaan method insert() sama persis ketika menggunakan method create(). Yang membedakan dari keduanya adalah nilai kembalinya.

Jika method create() akan mengembalikan nilai berupa objek dari model, maka method insert() akan mengembalikan nilai boolean. Apabila data berhasil disimpan, maka nilainya adalah true. Sedangkan jika gagal disimpan, maka akan bernilai false.

// contoh nilai kembalian dari method create

App\User {#715
name: "Yugo",
email: "dedy.yugo.purwanto@gmailcom",
updated_at: "2017-07-17 07:19:14",
created_at: "2017-07-17 07:19:14",
id: 1,
}

Pada dasarnya, method insert() cocok digunakan apabila data user tidak digunakan untuk proses lanjutan.

Menggunakan Method “FirstOrCreate”

Cara keempat ini serupa dengan menggunakan method create(). Hanya saja, di Eloquent ada aksi lebih yang dijalankan sebelum menyisipkan data, yaitu mengecek data yang sudah ada.

Mari ambil contoh, kalian ingin menambah user dengan data nama “Laravel”, sedangkan pos-elnya (email) adalah “mail@laravel.web.id”. Dengan cara konvensional, kalian bisa menuliskan skripnya menjadi seperti berikut.

$name = 'Laravel';
$email = 'mail@laravel.web.id';

$user = \App\User::whereEmail($email)
->whereName($name)
->first();

if (! empty($user)) {
$user = \App\User::create([
'name' => $name,
'email' => $email,
'password' => bcrypt('secret')
]);
}

return $user;

Dengan menggunakan method firstOrCreate(), pada dasarnya pemrogram tak perlu melakukan pengecekan secara manual. Biarkan Eloquent menangani hal tersebut secara otomatis.

$user = \App\User::firstOrCreate([
'name' => $name,
'email' => $email,
'password' => bcrypt('secret')
]);

Walaupun pada skrip kalian hanya menuliskan satu langkah, namun di belakang layar, Eloquent melakukan proses seperti alur pada skrip sebelumnya. Yaitu, melakukan pengecekan data berdasarkan nilai yang diberikan, jika sudah ada, maka kembalikan data dalam pangkalan data. Selain itu, maka simpan data baru dan kembalikan data baru tersebut.

Menggunakan Method “FirstOrNew”

Masih bersamgung dengan contoh skrip di atas.

Semisal, di pangkalan data sudah tersimpan data dengan nama “Laravel” dan pos-elnya adalah “mail@laravel.web.id”.

Kalian ingin menambahkan data baru dengan nama yang berbeda, misal “Tutorial Laravel”, namun masih menggunakan pos-el yang sama, yaitu “mail@laravel.web.id”.

Dengan asumsi bahwa pos-el (kolom email) harus bersifat unik, maka seharusnya ketika menambahkan data di atas, Eloquent akan mengembalikan data yang sudah ada di pangkalan data, bukan? Mari dicoba dengan method firstOrCreate() terlebih dahulu.

Illuminate\Database\QueryException with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'mail@laravel.web.id' for key 'users_email_unique'

Ketika saya saya menggunakan method firstOrCreate(), maka aplikasi menampilkan pesan kesalahan seperti di atas. Eloquent gagal menemukan data dengan spesifikasi nama dan pos-el seperti skrip di bawah. Itu artinya, validasi pos-el unik gagal dilakukan di aplikasi. Walau pada akhirnya data tetap gagal tersimpan karena ditolak oleh pangkalan data.

Kenapa bisa begitu?

Ketika menggunakan method firstOrCreate(), kalian memasukkan semua atribut beserta nilainya pada argumen pertama di method tersebut. Eloquent mengevaluasi datanya dengan mencocokkan semua atribute tersebut pada tabel. Jika dikonversi secara manual di skrip, hasilnya kira-kira seperti berikut:

$user = \App\User::whereName($name)
->whereEmail($email)
->wherePassword(bcrypt($password))
->first();

Dan, bisa dipastikan data yang dicari tidak akan cocok dengan data manapun di pangkalan data, sehingga validasinya gagal.

Apabila kalian mencoba menghilangkan key “name”, maka Eloquent juga akan mengembalikan pesan kesalahan bahwa kolom name tidak memiliki nilai. Padahal, niatnya sih hanya ingin mencocokkan nilai pos-elnya saja.

Lantas, bagaimana solusinya?

Solusinya adalah menggunakan method firstOrNew(), di mana kalian hanya perlu mencocokkan alamat pos-elnya saja.

$user = \App\User::firstOrNew([
'email' => $email,
]);

$user->name = $name;
$user->password = bcrypt('secret');

$user->save();

Pada argumen pertama method firstOrNew(), kalian melempar nilai array atribut dan nilai yang akan dievaluasi ke pangkalan data. Di baris selanjutnya, kalian meng-assign sebuah nilai pada properti model. Terakhir, menggunakan method save() secara manual untuk menyimpannya ke dalam pangkalan data.

Perlu diperhatikan, ketika menggunakan method firstOrNew(), jika data ditemukan, dan nilai yang di-assign ke berbeda dengan sebelumnya, maka Eloquent otomatis mengubah data yang sudah ada.

Mari buat coretan untuk memudahkan untuk memahaminya.

// data sebelumnya
Name: Laravel Indonesia
Email: mail@laravel.web.id
$user = \App\User::firstOrCreate([
'email' => 'mail@laravel.web.id',
]);

$user->name = 'Tutorial Laravel';
$user->password = bcrypt('secret');

$user->save();
// data setelah diperbarui
Name: Tutorial Laravel
Email: mail@laravel.web.id

***

Perbedaan nama method dan cara yang dilakukan untuk menyisipkan baris (insert row) ke pangkalan data mengunakan Eloquent bukan tanpa alasan. Ada kondisi khusus, di mana kalian harus menggunakan cara ini, dan kondisi lainnya harus menggunakan cara itu. Pada akhirnya, penggunaan cara di atas dikembalikan lagi ke pemrogram, apakah cara tersebut sudah sesuai dengan alur aplikasi yang akan dijalankan.

Terakhir, dari kelima cara tersebut, mana saja yang sudah kalian gunakan? Atau malah, baru tahu beberapa di antaranya? 😀

Originally published at www.laravel.web.id on July 17, 2017.

--

--