Проблема с сортировкой по чекбоксам laravel
У меня есть некоторые чекбоксы для сортировки по вакансиям, значения которых я заношу в url как параметры. Затем извлекаю эти параметры в контроллере - чётко видно, что они там есть, всё нормально - получается некоторый массив вида [1, 2, 3]. Затем я пытаюсь применить этот массив для whereIn, и здесь оно перестаёт работать, хотя при этом работает с аналогичным "самописным" массивом, т.е
$vacancies = $vacancies->whereIn('work_type_id', $work_types_id);
То, что выше не работает. А следующее работает прекрасно
$vacancies = $vacancies->whereIn('work_type_id', [1, 2, 3]);
При этом я сравнивал массивы array_diff, они одинаковые. При этом вся проблема в том, что конкретно в месте запроса whereIn проверить то, что хранится в массиве я не могу - там if ($request->ajax()) из-за пагинации и всё сопутствующее.
Может есть какие-то более адекватные способы сделать фильтрацию? Или я делаю что-то не так?
Полный код чекбоксов:
<p>work_types</p>
@foreach ($work_types as $work_type)
<label class="m-checkbox">
<input name="work_type" type="checkbox" value="{{ $work_type->id }}" @if (in_array($work_type->id, explode(',', request()->input('filter.work_type'))))
checked @endif>
{{ $work_type->name }}
</label>
@endforeach
<p>type_of_employments</p>
@foreach ($type_of_employments as $type_of_employment)
<label>
<input name="type_of_employment" type="checkbox" value="{{ $type_of_employment->id }}" @if (in_array($type_of_employment->id, explode(',', request()->input('filter.type_of_employment'))))
checked @endif>
{{ $type_of_employment->name }}
</label>
@endforeach
<script>
function getIds(checkboxName) {
let checkBoxes = document.getElementsByName(checkboxName);
let ids = Array.prototype.slice.call(checkBoxes)
.filter(ch => ch.checked == true)
.map(ch => ch.value);
return ids;
}
function filterResults() {
let brandIds = getIds("work_type");
let catagoryIds = getIds("type_of_employment");
let href = '/student/vacancy-feed?';
if (brandIds.length) {
href += 'work_type=' + brandIds;
}
if (catagoryIds.length) {
href += '&type_of_employment=' + catagoryIds;
}
document.location.href = href;
}
document.getElementById("filter").addEventListener("click", filterResults);
</script>
В контроллере нечто такое, но это до проверки ajax-запроса
$work_types_id = [];
$type_of_employments_id = [];
if ($request->exists('work_type') || $request->exists('type_of_employment')) {
if ($request->exists('work_type')) {
$work_types_id = explode(",", $request->query()['work_type']);
$work_types_id = array_map('intval', $work_types_id);
}
if ($request->exists('type_of_employment')) {
$type_of_employments_id = explode(",", $request->query()['type_of_employment']);
$type_of_employments_id = array_map('intval', $type_of_employments_id);
}
}
И в конце концов хотелось бы сделать нормальный whereIn
$vacancies = $vacancies->whereIn('work_type_id', $work_types_id);
Ответы (1 шт):
Сам написал, сам ответил...Если это когда-то кому-то понадобится - проблема была в том, что при пагинации нужно учитывать то, что уже находится в url, а не лепить его заново. Т.е теперь я получаю другие параметры поиска с помощью $(location).attr('search') и отправляю их вместе с get-запросом на пагинацию, если такие параметры есть. Если нет - просто запрос на пагинацию.