Say there's a blog kind of app. The main entity/model of the app would be Post (Blog Post).
When any author writes and publishes a Post,
- visitors to the blog site can leave Comment(s) for the Post
- visitors can Like a Post
So we have 3 models here
- Post - which can have many Comment(s)
- Post - can have many Like(s)
Now let's say for some reason we want to get all Post records from the database which either have 10 or more comments in the current month or 3 or more likes in the current month
We can write a query like
$posts = Post::whereHas('comments', function($query) {
$query->where('created_at', '>', now()->startOfMonth();
}, '>=', 10)
->orWhereHas('likes', function($query){
$query->where('created_at', '> ', now()->startOfMonth();
}, '>=', 3)
->get();
Laravel docs: https://laravel.com/docs/8.x/eloquent-relationships#querying-relationship-existence
Just like where
both whereHas
and orWhereHas
accepts closure as 2nd argument for more fine grained query control.
Actually whereHas
is supposed to be used when you want to have more power on constraints.
If you just want to check the existence of relation records you can use has
for eg:
Get all post records which either have comment or like and paginate 20 per page
$postsWithCommentsOrLikes = Post::has('comments')
->orHas('likes')
->paginate(20);
whereHas
or just aboutorWhereHas
? – BABAK ASHRAFIwhereHas
. – ml59