Apa Itu Lazy Loading Laravel Dan Bagaimana Penggunaanya
Untuk meningkatkan kinerja proyek Laravel Anda, Anda pasti harus tahu tentang lazy loading, mengapa digunakan dan bagaimana menerapkannya. Saat Anda menerapkan lazy loading, Anda akan mengurangi jumlah koneksi pada database dari 1000 kueri per permintaan menjadi 3 atau 4 kueri per permintaan!!
Sasaran: Meningkatkan kinerja dengan mengurangi jumlah koneksi yang dikirim ke database.
Anda ingin tahu caranya!? Lanjut membaca
Untuk menerapkan pemuatan lambat, Anda perlu mengingat dua fungsi penting ini saat mengambil data, dengan dan dengan Hitung.
Apa fungsi With dan bagaimana menggunakannya?
Mari kita ambil contoh ini: Kami sedang membangun platform yang menunjukkan daftar siswa dan di sekolah mana dia terdaftar di samping masing-masing. Jadi kami memiliki dua tabel utama dalam database Siswa dan Sekolah.
Tabel siswa akan memiliki kolom id dan nama, dan Sekolah akan memiliki kolom id dan nama.
Seorang siswa terdaftar di satu sekolah, dan sekolah mungkin memiliki satu atau lebih siswa yang terdaftar tahun ini. Untuk mencapai hubungan ini kita akan menambahkan atribut school_id ke tabel siswa.
Model masing-masing siswa dan sekolah akan seperti di bawah ini:
class Student extends Model { public function school {
return $this->belongsTo(School::class) }
}class School extends Model { public function students {
return $this->hasMany(Student::class) }
}
Sekarang dalam tampilan kita harus mengambil nama siswa dan sekolah masing-masing. Kodenya adalah sebagai berikut
// Fetch students
$students = Student::all();// Echo school name for each student
foreach ($students as $student) { echo $student->school->name;
}
Kode akan bekerja dengan sempurna dengan cara ini. Tapi mari kita menggali lebih dalam permintaan database untuk contoh ini.
$students = Student::all(); // select * from students;
foreach ($students as $student) {
echo $student->school->name; // select * from schools where id = x;
}
Jumlah koneksi database dalam contoh ini adalah 1+n. Setiap kali kami menanyakan nama sekolah, kami meminta kueri baru, karena
Data hubungan tidak akan dimuat sampai kita memiliki akses pertama ke properti.
Mari selesaikan masalah ini!
Hebatnya Laravel memiliki fungsi, fungsi kecil ini dapat mengambil semua data yang dibutuhkan dan menyimpannya di memori. Kode akan menjadi sebagai berikut:
$students = Student::with('school')->all();
// select * from students;
// select * from schools where id in (x,y,z....);foreach ($students as $student) { echo $student->school->name;
}
Jumlah koneksi database = 2.
Itu selalu lebih baik untuk memilih kolom tertentu yang kita butuhkan untuk diambil daripada *.
Jadi di sini Anda pergi
$students = Student::select('id','school_id')->with('school:id,name')->get();
// select id, school_id from students;
// select id, name from schools where id in (x,y,z....);foreach ($students as $student) { echo $student->school->name;
}
Apa itu fungsi WithCount dan bagaimana cara menggunakannya?
Sekarang kita harus menunjukkan daftar sekolah, dan di samping setiap jumlah siswa yang terdaftar. Di bawah ini adalah kode kerja
$schools = School::all();
foreach ($schools as $school) {
echo $school->students()->count();
}
Sekarang mari kita periksa permintaan basis data saat mengkompilasi kode tersebut
$schools = School::all(); // select * from schools;
foreach ($schools as $school) {
echo $school->students()->count(); // select count(*) from students where school_id = x group by school_id;
}
Ini juga memiliki n+1 masalah. Untuk mengatasi ini kita akan menggunakan withCount.
$schools = School::withCount('students')->get();
// select * from schools;
// select count(*) as students_count from students where school_id in (x,y,z...) group by school_id;foreach ($schools as $school) { echo $school->students_count;
}
Jumlah koneksi database = 2.
Fungsi WithCount akan menambahkan atribut {relationship}_count langsung ke model untuk menggunakannya secara bebas.
Pemuatan yang lambat pasti mengurangi jumlah koneksi ke database, tetapi pastikan Anda tidak memadati memori proyek Anda.
Jika Anda memiliki pertanyaan, jangan ragu untuk berkomentar di bawah ya.
Selamat mengcoding semuanya!!