The snippet below might work. It splits a search string by space and add a where clause for each word.
But consider using some dedicated package for it, I recommend one of these:
- https://github.com/laravel/scout (check the database driver)
- https://github.com/spatie/laravel-searchable
public function scopeFilter($builder, array $filters)
{
$builder->where(function ($query) use ($filters) {
if (filled($filters['designed_by'] ?? null)) {
$this->addSearchWhere($query, 'designed_by', $filters['designed_by']);
}
if (filled($filters['search'] ?? null)) {
$this->addSearchWhere($query, 'title', $filters['search']);
$this->addSearchWhere($query, 'description', $filters['search']);
}
});
}
private function addSearchWhere($builder, string $field, string $term)
{
$field = $builder->getGrammar()->wrap($field);
$words = preg_split('/\s+/', $term, PREG_SPLIT_NO_EMPTY);
foreach ($words as $word) {
$word = trim($word);
$word = str_replace('\\', '\\\\\\', $word);
$word = addcslashes($word, '%_');
$builder->orWhereRaw("{$field} LIKE ? ESCAPE ?", ["%{$word}%", '\\']);
}
}
EDIT fixed double escaping hidden by syntax highlighting