Changes between Version 7 and Version 8 of PrebaruvanjeDestinacii


Ignore:
Timestamp:
06/25/25 08:57:18 (3 days ago)
Author:
223270
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • PrebaruvanjeDestinacii

    v7 v8  
    66=== Реализација
    771. Внесување на критериуми за пребарување. Корисникот пристапува до функцијата за пребарување на дестинации, ги внесува своите преференции:
    8      * Тип на место (на пример, море, планина).
    9      * Приоритет на преференцијата (од 1 до 10).
    10      * Посакувана сезона за посета.
    11 2. Корисникот има можност да ги филтрира резултатите според:
    12      * Оценка на дестинацијата.
    13      * Датум на последна посета.
    14      * Присуство на коментари од други корисници.
     8     * Тип на место (на пример, море, планина)
     9     * Посакувана сезона (пролет, лето, есен, зима)
     10     * Приоритет (популарност од 1 до 10)
     112. Корисникот има можност да ги филтрира резултатите според горенаведените преференци.
    1512{{{
    16 SELECT d.*
     13SELECT DISTINCT d.*
    1714FROM DESTINACII d
    1815LEFT JOIN RECENZII r ON d.idDest = r.idDest
    19 LEFT JOIN (
    20     SELECT idDest, COUNT(*) AS brKomentari
    21     FROM KOMENTARI
    22     GROUP BY idDest
    23 ) k ON d.idDest = k.idDest
    24 WHERE d.tipoviMesta LIKE '%[внесен тип на место]%'
    25   AND d.idTag IN (SELECT idTag FROM TAGOVI WHERE tagOznaka LIKE '%[внесен приоритет]%')
    26   AND d.preporachanaSezona LIKE '%[внесена сезона]%'
    27   AND r.kvalitet >= [минимална оценка]
    28   AND r.datumRecenzija >= '[датум на последна посета]'
    29   AND (k.brKomentari > 0 OR k.brKomentari IS NULL);
     16WHERE
     17    (:tip IS NULL OR d.tipoviMesta ILIKE CONCAT('%', :tip, '%'))
     18  AND (:sezona IS NULL OR d.preporachanaSezona ILIKE CONCAT('%', :sezona, '%'))
     19  AND (
     20      :prioritet_min IS NULL OR :prioritet_max IS NULL OR
     21      d.idTag IN (
     22          SELECT idTag
     23          FROM TAGOVI
     24          WHERE tagOznaka::int BETWEEN :prioritet_min AND :prioritet_max
     25      )
     26  )
    3027}}}
     28
     29
     30
     31{{{
     32public function index(Request $request)
     33{
     34    $tip = $request->input('tipovimesta');
     35    $sezona = $request->input('preporachanasezona');
     36    $popularnost = $request->input('popularnost');
     37
     38    $prioritet_min = null;
     39    $prioritet_max = null;
     40
     41    if ($popularnost && str_contains($popularnost, '-')) {
     42        [$prioritet_min, $prioritet_max] = explode('-', $popularnost);
     43    }
     44
     45    $sql = "
     46        SELECT DISTINCT d.*
     47        FROM DESTINACII d
     48        LEFT JOIN RECENZII r ON d.idDest = r.idDest
     49        WHERE
     50            (:tip IS NULL OR d.tipoviMesta ILIKE CONCAT('%', :tip, '%'))
     51          AND (:sezona IS NULL OR d.preporachanaSezona ILIKE CONCAT('%', :sezona, '%'))
     52          AND (
     53              :prioritet_min IS NULL OR :prioritet_max IS NULL OR
     54              d.idTag IN (
     55                  SELECT idTag
     56                  FROM TAGOVI
     57                  WHERE tagOznaka::int BETWEEN :prioritet_min AND :prioritet_max
     58              )
     59          )
     60    ";
     61
     62    $destinacii = DB::select($sql, [
     63        'tip' => $tip !== 'any' ? $tip : null,
     64        'sezona' => $sezona !== 'any' ? $sezona : null,
     65        'prioritet_min' => $prioritet_min,
     66        'prioritet_max' => $prioritet_max,
     67    ]);
     68
     69    return view('destinations.index', compact('destinacii'));
     70}
     71
     72}}}