Use withExists() in Eloquent queries to inject boolean relationship presence flags directly into model attributes via SQL subqueries.
When displaying lists of records and checking if a child relationship exists (such as checking if a user has active subscriptions, or if a post has comments), loading full relations or calling $post->comments()->exists() inside a loop causes N+1 queries.
withExists() queries presence in SQL and injects a boolean attribute (relation_exists).
Querying Relationship Presence
use App\Models\User;
$users = User::withExists([
// Injects $user->posts_exists (true / false)
'posts',
// Filtered existence subquery: $user->active_subscription_exists
'subscriptions as active_subscription_exists' => function ($query) {
$query->where('is_active', true);
}
])->paginate(20);
In Blade Views
@foreach ($users as $user)
<div>
<h3>{{ $user->name }}</h3>
@if ($user->active_subscription_exists)
<span class="badge badge-success">Active Subscriber</span>
@endif
</div>
@endforeach
Summary
- Executes a fast SQL
EXISTS(SELECT 1 FROM ...)subquery. - Adds boolean attributes (
true/false) to hydrated models. - Avoids loading full relationship models into memory just to check presence.
Related Tips
View all tips →Optimize Date Queries by Replacing whereYear() with whereBetween()
Replace whereYear() and whereMonth() on large database tables with whereBetween() date ranges to enable SQL index lookups.
Sort Eloquent Results by Subquery Columns with orderByDesc()
Use query builder subqueries inside orderBy() and orderByDesc() to sort models by aggregated or related table columns directly in SQL.