Hey guys I’m currently trying to resolve why my legacy code doesn’t work the way it was intended to do so. It’s a basic category filter. My current problem is that I don’t really know what to fix.
I tried changing up whereHas, whereIn, orWhere query statement.
When I changed orWhere to just simply where, the filter worked only if one category was selected.
If anyone has any ideas to fix my problem, help would be gladly appreciated.
My code is below :
Backend(InternController.php) :
$intern = Intern::query()->with('category');
if ($request->categories) {
$intern->whereHas('category', function ($query) use ($intern, $request) {
foreach ($request->categories as $category) {
$query->orWhere('category_id', $category);
}
$query->whereIn('category_id', $request->categories);
});
}
$intern = $intern->get();
$categories = Category::all();
$category_intern = CategoryIntern::all();
return view('intern')->with($viewData)->with([
'intern' => $intern,
'categories' => $categories,
'category_intern' => $category_intern,
]);
Frontend(intern.blade.php):
<form method="GET">
<div class="mx-4">
<label for="select2Multiple" class="h3 pt-5 ml-auto">
Categories
</label>
<div class="row">
<div class="col-xl-2 mt-xl-1">
<select
class="select2-multiple form-control"
style="min-height: 70px"
name="categories[]"
multiple="multiple"
id="select2Multiple"
>
@foreach($categories as $category)
<option
value="{{ $category->id }}" {{ collect(request()->categories)->contains($category->id) ? "selected": ''}}>
{{ $category->name }}
</option>
@endforeach
</select>
</div>
<div class="col-xl-2">
<button type="submit"
class="btn btn-primary btn-sm text-uppercase font-semibold mt-1 "
style="background-color: #0d5eff; min-height: 32px"
>Choose category
</button>
</div>
</div>
</div>
</form>
Advertisement
Answer
Fixed, finally.
Deleted the foreach statement in the whereHas body.
final code looks like this
$intern = Intern::query()->with('category');
if ($request->categories) {
$intern->whereHas('category', function ($query) use ($intern, $request) {
$query->whereIn('category_id', $request->categories);
});
}
$intern = $intern->get();