DEV Community

Morcos Gad
Morcos Gad

Posted on

WhereHas() In Laravel

Let's get started quickly
You may want to base your results on the existence of a relationship. For example, imagine that you want to retrieve all projects that have project_one starting with ,CSS. To do this, you can pass the name of the relationship to the whereHas() method and specify additional query constraints for has queries

Project::whereHas('project_one', function (Builder $query) {
    $query->where('title', 'like', 'CSS%');
})->get();
Enter fullscreen mode Exit fullscreen mode

use with() method with WhereHas()

Project::with('project_one')->whereHas('project_one', function (Builder $query) {
       $query->where('title', 'like', 'CSS%');
})->get();
Enter fullscreen mode Exit fullscreen mode

Now, Let's be more professional

public function scopeWithWhereHas($query, $relation, $constraint){
   return $query->whereHas($relation, $constraint)->with([$relation => $constraint]);
}
Enter fullscreen mode Exit fullscreen mode

Then

Project::withWhereHas('project_one', fn($query) =>
     $query->where('title', 'like', 'CSS%')
)->get();
Enter fullscreen mode Exit fullscreen mode

Since this query builder may be needed in many Models in AppServiceProvider::boot()

use Illuminate\Database\Eloquent\Builder;
Builder::macro('withWhereHas', fn($relation, $constraint) =>
   $this->whereHas($relation, $constraint)->with([$relation => $constraint]);
);
Enter fullscreen mode Exit fullscreen mode

I hope you enjoy the code.

Discussion (0)