Laravel only get models where all relationships have a specific value.

Updated: Feb 22, 2025

Laravel only get models where all relationships have a specific value.

To get models in Laravel where all relationships have a specific value, you can use eager loading with constraints. Eager loading is a technique used in Laravel to load related models in a single query instead of making multiple queries.

First, let's assume we have two models, Post and Comment, where a Post has many Comments. We want to get all Posts where all their related Comments have a specific value, for example, approved = true.

Here's how you can achieve that:

use App\Models\Post;
use App\Models\Comment;

$posts = Post::has('comments', function ($query) {
    $query->where('approved', true);
})->get();

In the code above, we use the has method to eagerly load the related Comments for each Post. The has method accepts a closure as its second argument, which is used to define the relationship constraints. In this case, we use the where method to filter the related Comments based on the approved value.

The get method is used to execute the query and retrieve the results.

So, the $posts variable will contain all Post models where all their related Comments have the approved value set to true.

If you have multiple relationships and you want to apply constraints to all of them, you can chain multiple has methods:

use App\Models\Post;
use App\Models\Comment;
use App\Models\User;

$posts = Post::has('comments', function ($query) {
    $query->where('approved', true);
})->has('user', function ($query) {
    $query->where('status', 'active');
})->get();

In this example, we also load the related User model for each Post and apply a constraint to it as well. The $posts variable will contain all Post models where all their related Comments and User models meet the specified constraints.