Проблема с сортировкой по чекбоксам 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 шт):

Автор решения: ajdivof

Сам написал, сам ответил...Если это когда-то кому-то понадобится - проблема была в том, что при пагинации нужно учитывать то, что уже находится в url, а не лепить его заново. Т.е теперь я получаю другие параметры поиска с помощью $(location).attr('search') и отправляю их вместе с get-запросом на пагинацию, если такие параметры есть. Если нет - просто запрос на пагинацию.

→ Ссылка