Metode loadMissing
di Laravel menyediakan cara yang fleksibel untuk memuat relasi pada model atau koleksi yang ada. Pendekatan ini mencegah masalah kueri N+1 sekaligus memungkinkan Anda memuat relasi hanya jika diperlukan.
Dynamic Relationship Loading di Laravel adalah teknik untuk memuat relasi model secara fleksibel pada saat runtime (waktu program berjalan), bukan hanya saat model didefinisikan. Ini berguna sekali untuk mengambil relasi berdasarkan kebutuhan tertentu, terutama saat kita tidak tahu dari awal relasi mana yang perlu dimuat.
Biasanya di Laravel, kita memuat relasi dengan with() seperti ini:
$users = User::with('posts')->get();
Tetapi dengan dynamic relationship loading, kita bisa memuat relasi secara dinamis pada object model yang sudah ada. Caranya menggunakan method load()
atau loadMissing()
.
$user = User::find(1);
// Butuh relasi 'posts'
$user->load('posts');
Fitur ini sangat berguna saat membangun API dengan penyertaan opsional atau dasbor di mana bagian yang berbeda memerlukan data relasi yang berbeda.
$post->loadMissing(['comments', 'author']);
// Dengan constraints
$post->loadMissing(['comments' => function($query) {
$query->latest()->take(5);
}]);
Berikut ini contoh load data dasbor:
<?php
namespace AppHttpControllers;
use AppModelsDashboard;
use IlluminateHttpRequest;
class DashboardController extends Controller
{
public function show(Request $request, Dashboard $dashboard)
{
// Muat relasi dasar
$dashboard->loadMissing([
'widgets',
'owner',
]);
// Muat data tambahan secara kondisional
if ($request->section === 'analytics') {
$dashboard->loadMissing([
'widgets.viewHistory' => function($query) {
$query->whereBetween('viewed_at', [
now()->subDays(30),
now()
]);
},
'widgets.interactions'
]);
}
if ($request->section === 'sharing') {
$dashboard->loadMissing([
'sharedUsers',
'shareLinks' => function($query) {
$query->where('expires_at', '>', now());
}
]);
}
return $dashboard;
}
}
Metode loadMissing()
secara cerdas hanya memuat hubungan yang diperlukan:
// GET /dashboard/1?section=analytics
{
"id": 1,
"name": "Sales Overview",
"widgets": [
{
"id": 1,
"type": "chart",
"viewHistory": [
{
"viewed_at": "2024-02-01T10:30:00Z",
"views": 150
}
],
"interactions": [
{
"type": "filter_change",
"timestamp": "2024-02-01T11:20:00Z"
}
]
}
]
}
KesimpulanKesimpulan
loadMissing()
menyediakan cara yang efisien untuk mengelola pemuatan relasi, mengoptimalkan kueri basis data sambil mempertahankan fleksibilitas kode.