Filter Tanggal, Bulan, dan Tahun di Laravel

Yugo
Laravel Indonesia
Published in
2 min readFeb 18, 2017

Di SQL — khususnya MySQL — , biasanya kita menggunakan query di bawah untuk menyaring data berdasarkan tanggal, bulan, dan tahun (format YYYY-MM-DD).

SELECT * FROM users WHERE created_at = '2017-02-02';

Dengan asumsi formatnya berupa DATETIME (YYYY-MM-DD H:I:S), maka dapat menggunakan fungsi DATE() pada SQL untuk menghasilkan nilai kembalian yang sama dengan query di atas.

SELECT * FROM users WHERE DATE(created_at) = '2017-01-01';

Tak hanya dengan format lengkap, kita juga bisa menyaringnya berdasarkan tanggal saja, bulan saja, atau tahun saja. Jika ditulis berturut-turut, maka query-nya kurang lebih seperti berikut.

SELECT * FROM users where DAY(created_at) = '01';
SELECT * FROM users where MONTH(created_at) = '12';
SELECT * FROM users where YEAR(created_at) = '2017';

Laravel Query Builder

Pada dasarnya, developer jarang sekali menggunakan raw query seperti di atas ketika menggunakan Laravel. Selain karena memperlambat pengembangan, juga sudah tersedia fitur powerful berupa Query Builder — dan ORM — .

Query Builder punya kelebihan dan kekurangannya sendiri. Secara bawaan, penggunaan fungsi SQL pada method where() di Query Builder tidak didukung. Semisal, kita tulis seperti berikut:

$now = Carbon::now();DB::where('DAY(created_at)', $now);

Potongan skrip di atas akan menghasilkan kesalahan yang mengindikasikan kalau kolom DAY tidak ditemukan.

Solusinya, kita bisa menggunakan method raw() dari Query Builder. Sehingga, kalau dimodifikasi akan menghasilkan bentuk skrip seperti di bawah.

$now = Carbon::now()->format('d');DB::table('users')->where(DB::raw(DAY('created_at)), $now);

Jika query pencarian data berdasarkan tanggal, bulan, dan tahun saja, maka akan berbentuk seperti berikut:

$day = Carbon::now()->format('d');
$month = Carbon::now()->addMonth(1)->format('m');
$year = Carbon::now()->format('Y');
DB::table('users')->where(DB::raw(DAY('created_at)), $day);
DB::table('users')->where(DB::raw(MONTH('created_at)), $month);
DB::table('users')->where(DB::raw(YEAR('created_at)), $year);

Magic Method

Laravel sudah menyediakan magic method untuk menyaring data berdasarkan tanggal, bulan, atau tahun saja.

Berikut contoh alternatif penulisan Query Builder di atas.

DB::table('users')->whereDate($day);
DB::table('users')->whereMonth($month);
DB::table('users')->whereYear($year);

Penggunaan method raw() dari Query Builder tidaklah salah, hanya saja di Query Builder sudah tersedia method lebih sederhana untuk filter data secara spesifik.

Saya pribadi lebih suka menggunakan magic method whereDate(), whereMonth(), dan whereYear(). Selain karena lebih singkat dalam penulisan, skripnya juga lebih mudah dipahami. 😋

--

--