Есть желание сделать простейший рейтинг сервисов.
Функционал:
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
. Получается, в одном из вариантов это работает не будет. Тоже как бы не понятно, как это побороть.
Буду признателен любой помощи по этому поводу. Идеи, замечание по коду, предложение и т.д - за все заранее спасибо!