Фильтр коллекции Laravel с помощью флажков - PullRequest
0 голосов
/ 24 сентября 2018

Привет, я фильтрую набор данных в Laravel (5.7), используя параметры URL через отправку формы.

Ресурсы могут иметь много CurriculumLevels и много тем, вот код, который я использую для фильтрации на основевыбранные флажки:

if($request->get('subjects') || $request->get('levels')) {
        $subjects = $request->get('subjects');
        $levels = $request->get('levels');
        $resources = Resource::whereHas('subjects', function($query) use ($subjects) {
                    return $query->whereIn('id', (array)$subjects);
                })
                ->orWhereHas('curriculumLevels', function($query) use ($levels) {
                    return $query->whereIn('id', (array)$levels);
                })
                ->get();
    }else {
        $resources = Resource::all();
    }

Мои вопросы:

A) Это лучший способ фильтрации данных на основе выбора пользователя?

B) URL, сгенерированный изформа уродлива, как я могу это убрать, чтобы она выглядела как предметы = 1,2,3 и уровни = 1,2,3?

/resources?subjects%5B%5D=6&subjects%5B%5D=7&levels%5B%5D=2&levels%5B%5D=4

C) После отправки формы флажки больше не устанавливаются,Как я могу показать отмеченные флажки, используя параметры URL?

Оцените любую помощь!

1 Ответ

0 голосов
/ 24 сентября 2018

A) Используйте области видимости, это, скорее всего, лучший вариант.

// Model

public class Resource extends Model {
    public function scopeSelectedOptions($query, $input = [])
    {
        if(!empty($input)) {
            if(array_key_exists('subjects', $input)) {
                $query->whereHas('subjects', function($q) use ($input) {
                    return $q->whereIn('id', $input['subjects']);
                });
            }
            if(array_key_exists('levels', $input)) {
                $query->orWhereHas('curriculumLevels', function($q) use ($input) {
                    return $q->whereIn('id', $input['levels']);
                });
            }
        }

        return $query;
    }
}


// Controller code

public class ResourcesController extends Controller {
    public function index() {
        $resources = Resources::SelectedOptions(request()->all())->get();
    }
}

B) Стандарт RFC 3986 не заботится о том, что URL выглядит хорошо, также не следует, если конечный пользователь не должен его изменять.(этого никогда не бывает).Получить параметры не оптимизированы для SEO

C) Вы должны передать его дальше, после выполнения запроса POST

return redirect()->back()->withInput(request()->except('_token')); // or something close to it

Параметр withInput должен быть доступен через old() метод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...