Version 9 (modified by 3 days ago) ( diff ) | ,
---|
Пребарување на дестинации
Актери
Регистриран корисник
Реализација
- Внесување на критериуми за пребарување. Корисникот пристапува до функцијата за пребарување на дестинации, ги внесува своите преференции:
- Тип на место (на пример, море, планина)
- Посакувана сезона (пролет, лето, есен, зима)
- Приоритет (популарност од 1 до 10)
- Корисникот има можност да ги филтрира резултатите според горенаведените преференци.
SELECT DISTINCT d.* FROM DESTINACII d LEFT JOIN RECENZII r ON d.idDest = r.idDest WHERE (:tip IS NULL OR d.tipoviMesta ILIKE CONCAT('%', :tip, '%')) AND (:sezona IS NULL OR d.preporachanaSezona ILIKE CONCAT('%', :sezona, '%')) AND ( :prioritet_min IS NULL OR :prioritet_max IS NULL OR d.idTag IN ( SELECT idTag FROM TAGOVI WHERE tagOznaka::int BETWEEN :prioritet_min AND :prioritet_max ) )
DESTINACII е главната табела од која се земаат податоци. Преку LEFT JOIN се приклучува табелата RECENZII, со што се овозможува филтрирање и по податоци од рецензии (ако има потреба во иднина). ILIKE овозможува case-insensitive пребарување (на пр. ќе најде и "море" и "Море"). Ако не е внесен некој параметар (NULL), тој услов се игнорира и не се филтрира според него. За популарност, бараме idTag од TAGOVI каде што tagOznaka се наоѓа во дадениот опсег.
Ги зема сите дестинации (DESTINACII d). Им се приклучува табелата со рецензии (RECENZII r). Се филтрира според внесените параметри:
- тип на место
- сезона
- популарност
public function index(Request $request) { $tip = $request->input('tipovimesta'); $sezona = $request->input('preporachanasezona'); $popularnost = $request->input('popularnost'); $prioritet_min = null; $prioritet_max = null; if ($popularnost && str_contains($popularnost, '-')) { [$prioritet_min, $prioritet_max] = explode('-', $popularnost); } $sql = " SELECT DISTINCT d.* FROM DESTINACII d LEFT JOIN RECENZII r ON d.idDest = r.idDest WHERE (:tip IS NULL OR d.tipoviMesta ILIKE CONCAT('%', :tip, '%')) AND (:sezona IS NULL OR d.preporachanaSezona ILIKE CONCAT('%', :sezona, '%')) AND ( :prioritet_min IS NULL OR :prioritet_max IS NULL OR d.idTag IN ( SELECT idTag FROM TAGOVI WHERE tagOznaka::int BETWEEN :prioritet_min AND :prioritet_max ) ) "; $destinacii = DB::select($sql, [ 'tip' => $tip !== 'any' ? $tip : null, 'sezona' => $sezona !== 'any' ? $sezona : null, 'prioritet_min' => $prioritet_min, 'prioritet_max' => $prioritet_max, ]); return view('destinations.index', compact('destinacii')); }
Note:
See TracWiki
for help on using the wiki.