Prior to this simple PR, we needed verbose closures to do simple queries on relationships. Now it can be done on one line with these simple helpers.
This is how you would currently query the relationship on a model to narrow down your results.
1// Get me all users who have posts that are to be published in the future.2User::whereHas('posts', function ($query) {3 $query->where('published_at', '>', now());4})->get();
With this new PR, we can now refactor and simplify the above to the following:
1User::whereRelation('posts', 'published_at', '>', now())->get();
As you can see, we have collapsed the closure into the parameter list of the whereRelation
method.
With this PR, you also have access to orWhereRelation
, whereMorphRelation
, and orWhereMorphRelation
.
It is worth noting that because it uses a where clause under the hood, it would not be possible to use scopes:
1User::whereHas('posts', function ($query) {2 $query->notPublished();3})->get();
Or nested where:
1User::whereHas('posts', function ($query) {2 $query3 ->whereHas('tags', function ($query) {4 $query->where('name', 'Laravel');5 })6 ->where('published_at', '>', now());7})->get();
Though you should be able to use nested relations if you don't have any intermediate where clauses:
1User::whereRelation('posts.tags', 'name', 'Laravel')->get();