Cara Memanggil Method Eloquent first() Agar Tidak Terkena Null Pointer Exception
Masalah
Salah satu method Eloquent yang sering digunakan adalah first()
. Sesuai yang terdapat dalam dokumentasi resminya,
first()
digunakan untuk mengambil satu record dari database.
$user = User::where('email', 'foo@example.com')->first();
$fullname = $user->first_name . ' ' . $user->last_name;
Yang sering dilupakan oleh para programmer, method first()
di atas bisa jadi mengembalikan null
, ketika tidak ada data di database sesuai dengan kondisi yang diberikan.
Hasilnya, akan muncul error sejuta umat Trying to get property of non object
ketika mencoba mengakase properti $user->first_name
.
Solusi
Ada beberapa cara agar kode kita tidak error ketika data tidak ditemukan (method first()
mengembalikan null).
Beberapa diantaranya:
- Selalu tambahkan Guard Clause
- Gunakan
firstOrFail()
Tambahkan Guard Clause
Guard Clause adalah kode yang digunakan untuk memastikan suatu prekondisi terpenuhi sebelum bisa melanjutkan ke baris kode berikutnya.
$user = User::where('email', 'foo@example.com')->first();
if ($user) {
$fullname = $user->first_name . ' ' . $user->last_name;
} else {
$fullname = '-';
}
Atau menggunakan early return untuk menambah readability kode:
$user = User::where('email', 'foo@example.com')->first();
if (!$user) {
return '-'
}
return $user->first_name . ' ' . $user->last_name;
Ganti Dengan firstOrFail()
Jika first()
dipanggil dari Controller dan kondisinya merupakan input dari user, kita bisa menggantinya dengan firstOrfail
.
Contoh, user mencoba mengakses halaman http://localhost/user?email=invalid@example.com
:
$user = User::where('email', request('email'))->firstOrFail();
// Kode di bawah ini tidak akan dieksekusi jika email tidak ditemukan, halaman akan menampilkan 404
$fullname = $user->first_name . ' ' . $user->last_name;
Referensi: https://laravel.com/docs/10.x/eloquent#not-found-exceptions