Laravel Eloquent adalah salah satu ORM (Object-Relational Mapping) paling populer di dunia PHP. Meskipun banyak pengembang sudah familiar dengan fitur-fitur dasarnya, ada beberapa trik canggih di Laravel 10, 11, dan 12 ke atas yang jarang diketahui, namun sangat powerful untuk meningkatkan efisiensi dan kebersihan kode. Berikut adalah beberapa trik Eloquent yang mungkin belum banyak Anda eksplorasi.
1. Menggunakan upsert
untuk Efisiensi Insert atau Update
Fitur upsert
(tersedia sejak Laravel 8, tapi lebih dioptimalkan di Laravel 10) memungkinkan Anda untuk memasukkan atau memperbarui banyak baris data dalam satu query, mengurangi overhead database.
Contoh:
$users = [
['id' => 1, 'name' => 'John Doe', 'email' => '[email protected]'],
['id' => 2, 'name' => 'Jane Doe', 'email' => '[email protected]'],
['email' => '[email protected]', 'name' => 'New User'],
];
User::upsert(
$users,
['id'], // Kolom unik untuk menentukan update atau insert
['name', 'email'] // Kolom yang akan diupdate
);
Penjelasan:
- Jika id
sudah ada, Eloquent akan memperbarui kolom name
dan email
.
- Jika id
tidak ada, Eloquent akan membuat baris baru.
- Trik ini sangat berguna untuk sinkronisasi data besar, seperti impor CSV atau API sync.
2. Menggunakan withAggregate
untuk Relasi Berbasis Agregasi
Fitur withAggregate
memungkinkan Anda memuat hasil agregasi (seperti count
, sum
, atau avg
) dari relasi tanpa harus memuat semua data relasi tersebut.
Contoh:
$posts = Post::withAggregate('comments', 'id', 'count')
->get();
foreach ($posts as $post) {
echo $post->comments_count; // Menampilkan jumlah komentar tanpa memuat relasi
}
Penjelasan:
- Anda bisa mengakses hasil agregasi sebagai kolom virtual (comments_count
).
- Ini lebih efisien daripada memuat semua data relasi dan menghitung secara manual.
- Cocok untuk dashboard atau laporan yang membutuhkan ringkasan data.
3. Query Scope dengan Parameter Dinamis
Query scope di Eloquent sudah umum, tetapi Anda bisa membuatnya lebih fleksibel dengan parameter dinamis, termasuk logika kompleks.
Contoh:
class Post extends Model
{
public function scopePublishedBetween($query, $startDate, $endDate)
{
return $query->whereBetween('published_at', [$startDate, $endDate]);
}
}
// Penggunaan
$posts = Post::publishedBetween('2023-01-01', '2023-12-31')->get();
Penjelasan:
- Scope ini memungkinkan Anda menambahkan logika kustom dengan parameter dinamis.
- Anda juga bisa menggabungkan beberapa scope untuk query yang lebih kompleks.
- Jarang digunakan karena banyak pengembang hanya menggunakan scope sederhana tanpa parameter.
4. Menggunakan value
untuk Mendapatkan Kolom Tunggal
Jika Anda hanya membutuhkan nilai dari satu kolom, gunakan value()
untuk query yang lebih ringkas dan efisien.
Contoh:
$email = User::where('id', 1)->value('email');
Penjelasan:
- Method value()
langsung mengembalikan nilai kolom tanpa mengembalikan model penuh.
- Lebih cepat daripada first()->email
karena tidak memuat seluruh model.
- Cocok untuk skenario seperti validasi atau pengambilan data sederhana.
5. Batch Processing dengan chunkById
Untuk memproses data dalam jumlah besar, chunkById
lebih efisien daripada chunk
, karena menggunakan kolom ID untuk memastikan konsistensi data.
Contoh:
User::where('active', false)
->chunkById(100, function ($users) {
foreach ($users as $user) {
$user->delete();
}
});
Penjelasan:
- chunkById
memproses data berdasarkan ID, sehingga lebih aman untuk operasi seperti penghapusan massal.
- Mengurangi risiko kehilangan data saat query berjalan dalam waktu lama.
- Ideal untuk migrasi data atau tugas batch processing.
6. Menggunakan lockForUpdate
untuk Transaksi Aman
Fitur lockForUpdate
memungkinkan Anda mengunci baris saat transaksi untuk mencegah race condition.
Contoh:
DB::transaction(function () {
$user = User::where('id', 1)->lockForUpdate()->first();
$user->balance -= 100;
$user->save();
});
Penjelasan:
- lockForUpdate
mengunci baris di database sehingga tidak ada proses lain yang bisa mengubahnya selama transaksi.
- Berguna untuk aplikasi seperti sistem pembayaran atau inventaris.
- Jarang digunakan karena banyak pengembang tidak menyadari risiko race condition.
7. Custom Casts dengan Value Objects
Laravel 10 mendukung custom casts dengan value objects, memungkinkan Anda mengubah kolom database menjadi objek PHP dengan logika kustom.
Contoh:
use App\Casts\Money;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
protected $casts = [
'amount' => Money::class,
];
}
class Money
{
public function __construct(protected int $value)
{
}
public function toFormatted(): string
{
return '$' . number_format($this->value / 100, 2);
}
}
// Penggunaan
$order = Order::find(1);
echo $order->amount->toFormatted(); // Output: $99.99
Penjelasan:
- Anda bisa membuat logika kustom untuk memanipulasi data kolom (misalnya, format mata uang).
- Membuat kode lebih bersih dan terorganisir.
- Fitur ini jarang digunakan karena membutuhkan pemahaman mendalam tentang Eloquent casting.
Kesimpulan
Trik-trik di atas menunjukkan betapa kuatnya Eloquent di Laravel 10 ke atas. Dengan memanfaatkan fitur seperti upsert
, withAggregate
, atau custom casts, Anda bisa menulis kode yang lebih efisien, bersih, dan aman. Cobalah bereksperimen dengan trik ini pada proyek Anda, dan Anda akan melihat perbedaan besar dalam performa dan keterbacaan kode!