Eloquent

 

Eloquent

Ketika kita membuat model di Laravel, sebetulnya kita membuat Eloquent Model. Atau dengan kata lain semua model di Laravel merupakan turunan dari Eloquent model. Untuk mengeceknya silahkan buka salah satu file model yang pernah kita buat sebelumnya, yaitu app/Category.php

File app/Category.php

12345678910<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{

}

Penjelasan kode: Lihat kita menulis model Product dengan mengekstend Model, dari mana Model ini? Lihat baris di atasnya, yaitu use Illuminate\Database\Eloquent\Model. Kini kita tahu bahwa seluruh model di Laravel merupakan turunan dari Illuminate\Database\Eloquent\Model atau kita sebut Eloquent Model. Nah, lalu apa dampaknya? Dampaknya adalah kini setiap model memiliki method-method yang akan kita bahas pada bab Eloquent ini. Apa saja itu? Ada banyak, mari kita bahas satu per satu karena method ini akan sering kita pakai dalam pengembangan aplikasi Laravel.

Query Record

Menampilkan seluruh record

Method all() digunakan untuk mengambil semua data model dari tabel database yang bersangkutan. Misalnya model Product yang merepresentasikan tabel products, jika kita panggil method all seperti ini Product:all(), maka kita mengambil seluruh row pada tabel products.

Hasil dari method all() adalah berupa data bertipe Array, dan jika tabel masih kosong maka array kosong yang kita dapatkan.

Mencari record berdasarkan primaryKey

Method find() digunakan untuk mencari row berdasarkan primaryKey, misalnya seperti ini:

1Product::find(1) 

Penjelasan kode: Kode di atas mencari row di tabel products dengan id 1. Hasil dari method find() adalah single record, yang berarti sebuah instance dari Model, bukan Array. Dengan begitu jangan coba-coba melakukan perulangan (looping) ya karena akan error. Apabila tidak ada row ditemukan, maka null yang kita dapatkan.

Mendapatkan record pertama saja

Selain method find(), kita juga bisa mencari single row dengan method first(), bedanya first tidak menerima parameter apapun. Biasanya digunakan setelah kita melakukan filtering dengan method where() seperti ini:

1Product::where("status", "active")->first();

Penjelasan kode: Kode di atas mencari row di tabel products dengan kriteria column status bernilai "active" dan hanya ambil satu row pertama. Hasil dari first() juga merupakan instance dari model, bukan Array.

findOrFail()

Method findOrFail() bekerja mirip dengan find(), bedanya saat tidak ada row yang ditemukan maka akan otomatis melempar Error Model Not Found alias 404, bereda dengan find() yang mengembalkan nilai NULL jika row tidak ditemukan dengan id sesuai parameter.

1Product::findOrFail(1);

Penjelasan kode: Kode ini akan mencari row di tabel products dengan id 1, apabila tidak ada row yang ditemukan dengan id 1 maka otomatis berikan error 404 ke user. Method ini kita gunakan jika kita tidak ingin mengecek secara manual apakah row ditemukan atau tidak.

Aggregates

Method-method aggregates adalah method yang kita gunakan untuk menghitung beberapa rows dengan criteria tertentu dan mengembalikan sebuah nilai. Berikut daftar aggregates method yang tersedia.

count()

Menghitung jumlah row.

max()

Dapatkan nilai tertinggi dari kumpulan row berdasarkan field tertentu.

1Product::all()->max("price");

Penjelasan kode: Dapatkan nilai price tertinggi dari semua row di tabel products.

min()

Dapatkan nilai terendah dari kumpulan row berdasarkan field tertentu.

1Product::all()->min("price");

Penjelasan kode: Dapatkan nilai price terendah dari semua row di tabel products.

sum()

Jumlahkan nilai field tertentu.

1Product::all()->sum("stock");

Penjelasan kode: Jumlahkan semua nilai stock dari tabel products, dengan begitu kita bisa mendapatkan keseluruhan stock dari product yang ada di tabel.

avg()

Dapatkan nilai rerata berdasarkan field tertentu pada sebuah tabel.

1Product::all()->avg("price");

Penjelasan kode: Dapatkan nilai rerata harga product dari seluruh data di tabel products.

Insert Record

Kita telah mempelajari beberapa method yang ada di Eloquent, akan tetapi dari semua yang kita bahas sebelumnya belum ada method untuk mengubah database. Kita telah belajar bagiamana membaca data (query) dari database, dan sekarang kita akan mulai belajar untuk memanipulasi data ke database. Operasi pertama yang kita pelajari adalah insert record baru.

Ada dua cara untuk melakukan insert record ke dalam database yaitu dengan method save() dan create()

save()

Dengan method save() kita bisa menginsert record baru, caranya adalah kita buat model baru terlebih dahulu baru kita panggil method save(). Contoh kodenya seperti ini

1234$product_baru = new Product;
$product_baru->name = "Sepatu Coder";
$product_baru->description = "Deskripsi produk sepatu coder";
$product_baru->save();

Penjelasan kode: Untuk menggunakan method save() pertama kita buat terlebih dahulu model baru, karena kita akan menginsert ke tabel products, maka kita buat model Product dengan new Product dan kita simpan sebagai variabel $product_baru.

Setelah itu kita isi properti yang ada di model products, properti ini mewakili column yang ada di tabel products, yaitu name dan description. Kita mengisinya dengan $product_baru->name = "Sepatu Coder"; $product_baru->description = "Deskripsi sepatu coder";

Kita sudah membuat instance dari model Product, tetapi data yang kita tuliskan belum tersimpan ke database kita. Untuk menyimpannya kita panggil method save() di instance dari model Product yang baru kita buat tadi seperti ini:

1$product_baru->save() 

Dengan begini maka sekarang tersimpan data baru di tabel products dengan data name “Sepatu Coder” dan description “Deskripsi sepatu coder”.

Method save() mengembalikan instance model yang berhasil di simpan di database beserta dengan nilai field ID / primary key.

create()

Cara lain untuk membuat record baru di database adalah dengan method create(). Cara penggunaannya sedikit berbeda dengan save();

1234$product_tas = Product::create([
    "name" => "Tas Selempang Army",
    "description" => "Deskripsi tas selempang army"
]);

Penjelasan kode: Insert ke tabel products dengan method create pada model Product, method create() membutuhkan sebuah parameter bertipe array yang berisi data yang akan diinsert ke database.

PENTING! Apa yang dilakukan oleh method create() adalah menggunakan cara mass-assignment, method create bisa kita pakai, kita harus definisikan dulu properti apa saja dari model Product yang boleh untuk operasi mass-assignment. Kita telah mempelajarinya pada sub bab mass-assignment.

Update Record

save()

Method save() selain bisa kita gunakan untuk menginsert record baru ke database juga bisa kita gunakan untuk mengupdate record tertentu. Ketika menyimpan kita membuat model baru dengan new NamaModel misalnya new Product, sedangkan untuk mengupdate data, pertama kita query dulu record yang akan kita update.

12345678// select dari tabel products dengan ID 20
$produk_untuk_diupdate = Product::findOrFail(20);

// ubah nilai description dari record yang kita dapatkan
$produk_untuk_diupdate->description = "Deskripsi kita ubah di sini";

// simpan perubahan ke database untuk product dengan ID 20 tadi
$product_untuk_diupdate->save();

Penjelasan kode: Mengupdate nilai column description untuk produk dengan ID 20 ke database.

update()

Selain method save(), kita juga bisa mengupdate record dengan method update(); Method ini fungsinya mirip dengan create() untuk membuat data. Perbedaannya tentu saja, method update untuk mengupdate bukan membuat / menginsert record baru.

1App\Product::where("status", "active")->update(["status" => "inactive"]);

Penjelasan kode: Ubah status menjadi “inactive” dari semua data di tabel products yang saat ini memiliki status bernilai “active”

Method update() sama seperti method create() membutuhkan sebuah parameter bertipe array yang berisi data untuk diupdate ke database. Selain itu, untuk menggunakan method ini kita juga perlu mendefinisikan field / column apa saja yang boleh untuk operasi mass-assignment.

Delete Record

Ada dua cara untuk menghapus record di database kita ketika menggunakan Eloquent, yaitu dengan method delete() dan destroy()

Menghapus data model

Method ini kita panggil dari instance model tertentu. Misalnya pertama kita query terlebih dahulu sebuah model berdasarkan primary key seperti ini

1$product = Product::findOrFail(21);

Kita cari product dengan id 21 dan simpan sebagai variabel $product. Lalu kita hapus model tersebut dengan memanggil method delete seperti ini

1$product->delete();

Menghapus satu atau lebih data model berdasarkan primaryKey sekaligus

Destroy adalah cara lain untuk menghapus record / model. Method destroy() membutuhkan parameter yang bisa berupa string / integer mewakili nilai primary key atau Array yang berisi satu atau lebih nilai primary key seperti ini

12345678// hapus product yang memiliki ID 22
App\Product::destroy(22);

// hapus product dengan ID 23,25,31
App\Product::destroy([23,25,21]);

// cara ini bekerja persis seperti cara sebelumnya 
App\Product::destroy(23,25,21);

Perhatikan! mungkin kamu bertanya-tanya, kenapa sekarang kita menggunakan App\Product, padahal sebelumnya kita cuma pakai Product. Apa bedanya? Tenang, keduanya merujuk ke model yang sama yaitu model Product. Apabila ingin menggunakan Product saja, pastikan sudah import model tersebut di bagian atas file model Product dengan kode ini use App\Product;

Soft Deletes

Soft delete merupakan sebuah cara untuk menghapus sebuah record tanpa langsung menghapusnya dari database. Dengan kata lain sebetulnya data yang disoft delete masih ada di record tabel, akan tetapi column deleted_at di record tertentu akan diisi sebuah nilai yaitu timestamp kapan model tersebut dihapus.

Jika column deleted_at tidak null alias ada isiannya, maka model tersebut statusnya adalah sedang dihapus.

Jika kita ingin menggunakan fitur soft deletes, pertama kita harus buat sebuah column di tabel kita bernama deleted_at, jika kita menggunakan file Migration kita bisa membuat field tersebut dengan memanggil method softDeletes()dari Schema Builder (lihat kembali bahasan Migration).

Kemudian kita harus menggunakan trait Illuminate\Database\Eloquent\SoftDeletes pada model yang ingin kita aktifkan soft delete. Sehingga model kita akan tampak seperti ini

123456789101112131415<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

// PERHATIKAN INI!
use Illuminate\Database\Eloquent\SoftDeletes;

class Category extends Model
{
    // DAN INI
    use SoftDeletes;
}

Jika tanpa menggunakan soft delete, ketika kita memanggil delete() atau destroy() maka record yang kita pilih akan langsung dihapus dari tabel. Sedangkan jika menggunakan soft delete tidak seperti itu. Saat kita mengaktifkan soft delete maka ingat, kita memiliki column deleted_at pada tabel, column ini defaultnya bernilai NULL. Dan NULL berarti record tersebut dalam kondisi tidak dihapus, kemudian saat kita memanggil method delete() atau destroy() maka record yang kita pilih memiliki nilai pada column deleted_at, artinya column deleted_at tidak lagi bernilai NULL, sehingga kini record-record tersebut statusnya soft deleted (dihapus), tetapi tetap tersimpan di tabel. Jika kita query menggunakan eloquent, record-record ini tidak akan muncul karena dianggap telah dihapus.

Analogi lain untuk memudahkan kamu memahami soft delete adalah, setiap model yang dihapus masuk terlebih dahulu ke tong sampah, artinya masih kita bisa restore kembali jika kita perlukan dengan mengambilnya dari tong sampah. Untuk membuagnya secara permanen maka kita harus keluarkan dari tong sampah dan membakarnya. Begitu.

Dengan penjelasan di atas, kamu mungkin bertanya, berarti model yang sudah disoft delete bisa direstore kembali. Yup, betul sekali, itulah gunanya soft delete, kita bisa merestorenya kembali jika ternyata kita masih membututuhkan model yang sudah disoft delete.

Untuk memahami lebih lanjut apa saja yang bisa kita lakukan dengan fitur soft delete di Laravel sebaiknya kita bahas satu per satu method apa saja yang tersedia

trashed()

Method trashed() digunakan untuk mengecek apakah sebuah model dalam kondisi di tempat sampah alias soft deleted. Seperti ini:

1234$product = App\Product::findOrFail(23);
if($product->trashed()){
 // ya product sedang berada di tempat sampah / soft deleted
}

Penjelasan kode: Melakukan pengecekkan apakah record di tabel products dengan ID 23 sedang di tong sampah. Method trashed() mengembalikan nilai Boolean, true jika model tersebut soft deleted dan false jika model tersebut dalam kondisi tidak disoft deleted.

restore()

Method restore() kita gunakan untuk mengembalikan model yang sebelumnya berada di tong sampah / soft deleted agar kembali aktif atau tidak soft deleted. Melanjutkan contoh kode sebelumnya, kita ingin merestore product dengan id tertentu apabila statusnya sekarang soft deleted, maka kita lakukan seperti ini:

123456789// cari produk di tabel products dengan ID == 23
// jika gagal lempar error 404
$product = App\Product::findOrFail(23);

// jika ketemu dan statusnya soft deleted (trashed)
// restore
if($product->trashed()){
    $product->restore();
}

Penjelasan kode: Dapatkan model products dengan id 23, kemudian cek menggunakan method trashed() apakah sedang berada di tong sampah / soft deleted, jika iya maka restore model tersebut.

withTrashed()

Kami tadi menjelaskan bahwa ketika kita melakukan query terhadap model yang mengaktifkan soft delete, maka semua record yang berstatus soft deleted tidak ikut terquery. Tetapi terkadang kita ingin menquery keduanya, baik soft deleted atau tidak. Maka, untuk mengikutsertakan hasil dari model yang berstatus soft deleted kita gunakan method withTrashed() pada query kita, misalnya seperti ini:

1$product = App\Product::where("owner", 12)->withTrashed()->get();

Penjelasan kode: Dapatkan record dari tabel products yang nilai column ownernya adalah 12, ikut sertakan juga record yang berstatus soft deleted.

onlyTrashed()

Berbeda dengan withTrashed()onlyTrashed() justru mengembalikan record-record yang berstatus soft deleted saja. Tanpa menyertakan record yang belum disoft delete.

1$product_trashed = App\Product::where("owner", 12)->onlyTrashed()->get();
forceDelete()

forceDelete() kita gunakan untuk menghapus sebuah record secara permanen meskipun kita menggunakan softDelete pada model yang terkait.

Data Pagination

Dengan menggunakan Eloquent untuk memanipulasi data, kita jadi lebih mudah untuk melakukan paging. Fitur pagination bawaan Laravel mendukung baik jika kita menggunakan Query Builder atau Eloquent. Ada dua metode yang bisa kita gunakan untuk melakuka pagination di laravel yaitu simplePaginate() dan paginate().

simplePaginate()

Method simplePaginate() memiliki sebuah parameter opsional yaitu berapa item yang ingin kita tampilkan per halamannya. Misalnya kita ingin menampilkan data dari tabel products per halaman 25 product, maka kita gunakan simplePaginate(25).

File app\Http\Controllers\ProductController.php

12345678910111213<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProductController extends Controller
{
   public function index()
   {
      return view("products.list", ["products"=>\App\Product::simplePaginate(25)]);
   }
}

paginate()

Method paginate() bekerja seperti halnya simplePaginate() yaitu memiliki sebuah parameter opsional berupa jumlah item yang ingin kita tampilkan per halaman. Untuk menggunakannya cukup tuliskan paginate(25) misalnya.

File app\Http\Controllers\ProductController.php

12345678910111213<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProductController extends Controller
{
   public function index()
   {
      return view("products.list", ["products"=>\App\Product::paginate(25)]);
   }
}

Perhatikan: Method simplePaginate() dan paginate()apabila tidak diberikan parameter maka default data per halaman adalah 15.

Perbedaan simplePaginate() dan paginate()

Perbedaan pertama antara simplePaginate dengan paginate adalah, simplePaginate kita gunakan jika kita hanya ingin menampilkan tombol “next” dan “prev” tanpa perlu menampilkan informasi pagination lainnya seperti halaman yang aktif, jumlah halaman, halaman terakhir, dll. Menggunakan simplePaginate akan lebih efisien untuk data yang besar.

Perbedaan kedua adalah, ketika kita memanggil simplePaginate() dan paginate() maka kita akan bisa mengakses beberapa method berkaitan dengan pagination di view kita, namun ada 2 method yang tidak tersedia di simplePaginate() tapi tersedia jika menggunakan paginate(). Apa saja method-method tersebut?

Method berkaitan dengan hasil PaginationDeskripsi
count()Dapatkan jumlah data set dari seluruh halaman
currentPage()Dapatkan halaman ke berapa yang sedang aktif
firstItem()Dapatkan item pertama dari seluruh data set
hasMorePages()Cek apakah masih ada halaman selanjutnya
lastItem()Dapatkan item terakhir dari seluruh data set
lastPage()Tidak tersedia di simplePaginate(). Dapatkan halaman terakhir
nextPageUrl()Dapatkan url halaman selanjutnya, misalnyacurrentPage = 3, maka akan bernilai URL untuk page 4
perPage()Dapatkan berapa jumlah item per halaman.
previousPageUrl()Dapatkan url halaman sebelumnya,misalnya currentPage = 3, maka akan bernilai URL untuk page 2
total()Tidak tersedia di simplePaginate(). Dapatkan total halaman dari pagination.
url($page)Generate link ke halaman tertentu ($page). Berguna untuk fitur lompat ke halaman.

Menampilkan link pagination di view

Method simplePaginate() dan paginate() berfungsi untuk mengambil data dari database sesuai jumlah item per halaman yang kita inginkan. Tugas selanjutnya bagi developer adalah untuk menampilkan link / tombol pagination di view agar pengguna aplikasi dapat melakukan navigasi ke halaman tertentu.

Untuk menampilkan link / tombol pagination pada sebuah view tentu langkah pertama yang harus kita lakukan adalah dengan menggunakan method simplePaginate() / paginate() di controller yang menggunakan view tersebut.

Bila kita perhatikan contoh kode sebelumnya yaitu pada ProductController.php, kita melakukan paginate pada model Product, dan melemparkan ke view “products.list” yang berarti file view tersebut terletak pada resources/views/products/list.blade.php. Data tersebut dilempar sebagai variabel $products, lihat bagian [“products” => \App\Product::paginate(25)].

Berarti, kini pada file view tersedia variabel $products yang berisi 25 data products pertama jika misalnya ada 300 data di database. Maka kita bisa menampilkan products tersebut dengan Blade melalui looping. Selanjutnya, kita ingin menampilkan tombol pagination di bawah daftar products, maka kita gunakan sebuah method pagination yaitu links() seperti ini

File resources/views/products/list.blade.php

1234567<ul>
@foreach($products as $p)
   <li>{{$p->name}}</li>
@endforeach
</ul>

{{$products->links()}}

Dengan begitu maka akan muncul tombol markup pagination yang sudah mendukung Bootstrap CSS Framework secara otomatis

Komentar

Postingan populer dari blog ini

Puisi : Kerendahan Hati

Apa itu BMR, NEAT, EAT, TEF dan TDEE?

Kecerdasan: Dari Data Hingga Kebijaksanaan