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();
use with() method with WhereHas()
Project::with('project_one')->whereHas('project_one', function (Builder $query) {
$query->where('title', 'like', 'CSS%');
})->get();
Now, Let's be more professional
public function scopeWithWhereHas($query, $relation, $constraint){
return $query->whereHas($relation, $constraint)->with([$relation => $constraint]);
}
Then
Project::withWhereHas('project_one', fn($query) =>
$query->where('title', 'like', 'CSS%')
)->get();
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]);
);
I hope you enjoy the code.
Top comments (0)