@PRodion

Как реализовать пресеты для фильтра (SEO-фильтр)?

Есть желание сделать простейший рейтинг сервисов.

Функционал:

1. На главной выводятся все сервисы.
2. Если пользователь воспользовался фильтром, то выводим сервисы, удовлетворяющие условия пользователя.
3. Если к фильтру был назначен пресет, то делаем переадресация.

Три таблицы. Services, Features и Presets. Пресет определяется по get-параметрам (Country=1&Lang=2). То есть, либо просто фильтруем сервисы, либо перенаправляем на пресет и там будет другая логика.

Набросал приблизительный код. За работоспособность не ручаюсь т.к не проверял. Просто написал для того, чтобы хотя бы приблизительно понимать логику.

class ServiceController extends Controller
{
    public function index(Request $request)
    {
        $services = Service::where('active', true);
        $features = $request->query();

        if ($features) {
            $preset = Preset::where('features', $features)->first();

            if ($preset) {
                return redirect()->route('preset', [
                    'preset' => $preset->slug
                ]);
            }

            $services->whereHas('features', function ($query) use ($features) {
                foreach ($features as $key => $value) {
                    $query->where($key, $value);
                }
            });
        }

        return view('index', [
            'services' => $services->get()
        ]);
    }
}


1. Соответственно проблема №1 Preset::where('features', $features)->first();. У нас здесь массив, а нам в where() требуется строка. Как это можно побороть?
2. Можно написать Country=1&Lang=2 и Lang=2&Country=1. Получается, в одном из вариантов это работает не будет. Тоже как бы не понятно, как это побороть.

Буду признателен любой помощи по этому поводу. Идеи, замечание по коду, предложение и т.д - за все заранее спасибо!
  • Вопрос задан
  • 241 просмотр
Решения вопроса 1
pLavrenov
@pLavrenov
Разработка сайтов
Проблема 1) из массива можно сделать строку, http_build_query()
Проблема 2) Мож на моменте добавления в базу и на иоиенте проверки наличия в базе сортировать массив по алфавиту и тогда очередность будет не важна.
Проблема 3) $features = $request->query(); вместо этого лучше бы использовать валидацию.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
JhaoDa
@JhaoDa
LaravelRUS Team
1. Храни массив.
2. Сортируй.
3. Читай документацию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы