Laravel's loadMissing method provides a flexible way to eager load relationships on existing models or collections. This approach prevents N+1 query problems while allowing you to load relationships only when necessary.
This feature is particularly valuable when building APIs with optional includes or dashboards where different sections require different relationship data.
$post->loadMissing(['comments', 'author']);// With constraints$post->loadMissing(['comments' => function($query) { $query->latest()->take(5);}]);
Here's an example of a dashboard data loader:
<?php namespace App\Http\Controllers; use App\Models\Dashboard;use Illuminate\Http\Request; class DashboardController extends Controller{ public function show(Request $request, Dashboard $dashboard) { // Load base relationships $dashboard->loadMissing([ 'widgets', 'owner', ]); // Conditionally load additional data 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; }}
The loadMissing method intelligently loads only the required relationships:
// 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" } ] } ]}
LoadMissing provides an efficient way to manage relationship loading, optimizing database queries while maintaining code flexibility.
