Laravel Eloquent

Check Relationship Presence Efficiently with withExists()

Punyapal Shah 1 min read
edit this tip
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.
Tags: Laravel Eloquent Database Performance
Share on X

// Found an issue or want to contribute a tip? github.com/MrPunyapal/tips