Create & Update Lebih Ringkas dan Praktis

Dengan menggunakan Eloquent, kita punya lima cara yang berbeda untuk menyisipkan baris ke pangkalan data. Cara paling umum yang digunakan adalah model instance atau menggunakan method create($data).

Mari kita mulai dengan menggunakan method create($data).

/**
 * Store user data from request.
 *
 * @param  Request            $request
 * @return RedirectResponse
 */
public function store(\Illuminate\Http\Request $request): \Illuminate\Http\RedirectResponse
{
    $user = \App\User::create([
        'name' => $request->name,
        'email' => $request->email,
        'password' => bcrypt($request->password),
    ]);

    return redirect('user')
        ->with('user', $user);
}

Penggunaan method create($data) cukup praktis apabila jumlah kolom di pangkalan data tidak terlalu banyak. Lain cerita jika jumlah kolomnya sudah puluhan. Akan merepotkan ketika harus mendifinisikannya satu persatu. Belum lagi jika ada penambahan atau pengurangan kolom, definisi data pada method create($data)otomatis juga harus diubah.

Agar lebih sederhana dan otomatis, kita bisa menggunakan trik di bawah untuk sisipan skrip data yang lebih efektif.

Syarat pertama untuk menggunakan skrip tersebut adalah dengan mendifinisikan properti $fillable (daftar kolom) pada model. Sebagai contoh, saya menggunakan model App/User.php yang sudah tersedia di Laravel.

Baca juga: Berkenalan dengan Magic Property (Properti) Eloquent.

<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

Kemudian, dari contoh skrip pertama di atas, modifikasi beberapa bagian sehingga menjadi seperti berikut.

/**
 * Store user data from request.
 *
 * @param  Request            $request
 * @return RedirectResponse
 */
public function store(\Illuminate\Http\Request $request): \Illuminate\Http\RedirectResponse
{
    $user = \App\User::create($request->all());

    return redirect('user')
        ->with('user', $user);
}

Jauh lebih ringkas bukan?

Jika ada penambahan atau pengurangan kolom di pangkalan data, kita cukup menambahkannya di properti $fillable pada model tanpa harus mengubah apapun pada bagian insert data.

Jika kalian sedikit kebingungan memahami potongan baris di atas, mari kita bahas baris demi baris.

Method all() pada object $request berfungsi untuk mendapatkan semua data request dalam bentuk array key dan value berpasangan. Tak perlu khawatir ada key yang tidak sesuai nama kolom tabel. Eloquent otomatis menyaringnya berdasarkan properti fillable yang telah kita definisikan di atas.

Perlu diperhatikan, ketika menggunakan teknik di atas, maka nama key request harus sama dengan nama kolom yang ada di pangkalan data (didefinisikan di $fillable).

Bagaimana Jika Saya Menggunakan Model Instance?

Walaupun properti $fillable pada model tidak dibutuhkan secara mutlak ketika menggunakan model instance, namun untuk menggunakan teknik di atas, properti ini harus diisi untuk menyaring kolom apa saja yang akan digunakan pada saat proses insert.

Sebagai permulaan, berikut contoh insert data menggunakan model instance yang biasa digunakan.

/**
 * Store user data from request.
 *
 * @param  Request            $request
 * @return RedirectResponse
 */
public function store(\Illuminate\Http\Request $request): \Illuminate\Http\RedirectResponse
{
    $user = new User;
    $user->name = $request->name;
    $user->email = $request->email;
    $user->password = bcrypt($request->password);
    $user->save();

    return redirect('user')
        ->with('user', $user);
}

Dengan cara sederhana, kita dapat memodifikasinya menjadi seperti skrip di bawah.

/**
 * Store user data from request.
 *
 * @param  Request            $request
 * @return RedirectResponse
 */
public function store(\Illuminate\Http\Request $request): \Illuminate\Http\RedirectResponse
{
    $user = new User;
    $user->fill($request->all());
    $user->save();

    return redirect('user')
        ->with('user', $user);
}

Method fill(array $attributes) berfungsi untuk menambahkan array ke atribute yang didefinisikan di $fillable. Cara lain, bisa juga melempar argumen request ke constructor model.

$user = \App\User::create($request->all());
$user->save();

Modifikasi Nilai (Value) Request

Jika dilihat lagi, pada potongan skrip yang belum dioptimasi, maka akan ditemui penggunaan fungsi bcrypt($value, $options = []) untuk meng-hash sebuah string. Ketika kita memodifikasi skrip tersebut menjadi skrip yang lebih sederhana, maka fungsi bcrypt() ini tidak digunakan di manapun. Alhasil, nilai password (dalam contoh kasus) disimpan dalam bentuk string apa adanya.

Untuk menangani kasus ini, kita bisa menggunakan method merge(array $input) dari objek $request. Tambahkan potongan skrip di bawah sebelum method create() atau save() pada model.

$request->merge(['password' => bcrypt($request->password)]);

Menambahkan Nilai (Value) Request

Jika bagian di atas memodifikasi nilai yang sudah tersedia di objek $request, bagian ini menjelaskan penambahan nilai baru pada request.

$request->request->add(['token' => str_random()]);

Penambahan nilai pada request biasanya diimplementasikan untuk menyimpan sebuah nilai ke pangkalan data, tapi sumber datanya diproses di sisi backend, bukan dari input oleh user.

Baca juga pos eksternal: How to “artificially” add values to Request array.

Bagaimana dengan Update?

Jika kalian sudah berhasil menjalankan optimasi skrip dengan model instance, maka pada dasarnya implementasi di bagian update sama saja.

Sebagai contoh:

/**
 * Update exisiting users.
 *
 * @param  Request            $request
 * @param  User               $user
 * @return RedirectResponse
 */
public function update(\Illuminate\Http\Request $request, \App\User $user): Illuminate\Http\RedirectResponse
{
    $user->fill($request->all());
    $user->save();

    return redirect('users')
        ->with('user', $user);
}

Apabila kalian bingung darimana variabel $user berasal, maka kalian perlu membaca pos lain dengan judul Model Binding di Laravel.

Selamat mencoba! 😉

Tinggalkan Balasan