Основная проблема с вашим кодом - ваши locations
и categories
поисковые запросы не устанавливали $jobs
снова. Это должно выглядеть так:
$jobs = $jobs->whereHas('categories', function ($q) use ($categories) {
$q->whereIn('slugs', $categories);
});
Это установит переменную $jobs
для включения новых условий запроса.
Я бы также предложил не проверять, являются ли $locations
или $categories
пустыми, так как они, если операторы для каждого уже имеют дело с условием. Вот некоторый переработанный код:
public function getBy(Request $request) {
$sorting = $request->all()['sorting'];
//--- sorting code ---
//keyword request
if (! $keywords = request('keywords')) {
$jobs = Job::query();
} else {
$jobs = Job::query()->where('job_title', 'LIKE', "%{$keyword}%")
->orWhere('title', 'LIKE', "%{$keyword}%")
->orWhere('description', 'LIKE', "%{$keyword}%")
->orWhereHas('users', function ($q) use ($keyword) {
$q->where('company_name', 'LIKE', "%{$keyword}%");
})->orWhereHas('categories', function ($q) use ($keyword) {
$q->where('category', 'LIKE', "%{$keyword}%");
})->orWhereJsonContains('tags', $keyword);
}
foreach (['categories', 'locations'] as $field) {
if ($request->filled($field)) {
$jobs = $jobs->whereHas($field, function ($q) use ($field) {
$q->whereIn('slugs', request($field));
});
}
}
return $jobs->get()->toArray();
}
Здесь мы перебираем данные запроса categories
и locations
и видим, являются ли данные ->filled()
(определены и не пусты). Если это так, мы запускаем запрос.