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