Поиск Codeigniter со значениями через запятую - PullRequest
0 голосов
/ 13 декабря 2018

Я пытался добиться расширенного поиска с использованием фреймворка codeigniter.У меня есть окно поиска, в котором есть несколько значков для поиска.Затем, если пользователь попытается найти 1 значок, например, значок парковки, он должен отобразить все профили, которые имеют этот значок.И если пользователь нажимает больше значков, например, парковка, пиво, подходит для пары ... будут отображаться только те профили, которые имеют эти характеристики ..

Информация о базе данных:

-----------------------------------------------------
place_id            icon_ids
-----------------------------------------------------
1                 1,2,3,4,5,6,7,8
2                 1,2,3,7,9
3                 1,3,4      
4                 1,2,4,5,9,10
5                 1,2,3,5,6,8,9,10
-----------------------------------------------------

МОДЕЛЬ

public function get_search_content($info_id, $search_queries, $query_type, $limit, $start, $action_type)
    {
        if($query_type === 'icons')
        {

            $count_id = explode(',', $info_id);
            $count_id = count($count_id);

            if($count_id > 1)
            {

                $search  = "lai.info_id IN (".$info_id.")";


                $query = $this->db->select('*, c.id AS cat_id, bh.id AS hour_id, bh.place_id AS bh_place_id, c.name AS cat_name, l.place_id AS place_id, lai.place_id AS lai_place_id')

                ->where($search)

                ->join('listing_additional_info lai', 'lai.place_id=l.place_id', 'LEFT')
                ->join('cities cy', 'cy.city_id=l.city_id', 'LEFT')
                ->join('cats c', 'c.parent_id=l.cat_id', 'LEFT')
                ->join('business_hours bh', 'bh.place_id=l.place_id', 'LEFT')
                ->group_by('lai.place_id', 'ASC')
                ->limit($limit, $start)
                ->get('listings l');
            }
            else
            {

                $search  = "FIND_IN_SET('".$info_id."', lai.info_id)";

                $query = $this->db->select('*, c.id AS cat_id, bh.id AS hour_id, bh.place_id AS bh_place_id, c.name AS cat_name, l.place_id AS place_id, lai.place_id AS lai_place_id')
                ->distinct()
                ->where($search)

                ->join('listing_additional_info lai', 'lai.place_id=l.place_id', 'LEFT')
                ->join('cities cy', 'cy.city_id=l.city_id', 'LEFT')
                ->join('cats c', 'c.parent_id=l.cat_id', 'LEFT')
                ->join('business_hours bh', 'bh.place_id=l.place_id', 'LEFT')
                ->group_by('lai.place_id', 'ASC')
                ->limit($limit, $start)
                ->get('listings l');
            }


        }
}

public function m_search_queries($limit, $start)
    {

        // $info_id = $this->input->get('info_id');
        $info_id = $this->input->get('info_id_');

        $search_queries = $this->input->get('q');

        $submit_search = $this->input->get('submit_search');

        if($submit_search == 'true')
        {
            if(!empty($info_id))
            {

                    echo $this->get_search_content($info_id, $search_queries, 'icons', $limit, $start, 'content');


            }
            elseif(!empty($search_queries))
            {
                echo $this->get_search_content($info_id, $search_queries, 'input', $limit, $start, 'content');

            }
            else
            {
                $rs = '';
                $rs .= '<div class="bg bg-info text-white p-3">Sorry, we could not find what you are looking for.</div>';

                echo $rs;
            }
        }

    }

ПРОСМОТР

<form method="GET" action="<?= base_url().lang(); ?>/search" class="">
        <div class="mb-2" id="add-data-info">
           <?php for($i=1; $i<=13; $i++){ ?>
           <div class="btn add_selector search_add_selector search_add_selector_<?= $i; ?> search_add_info_view">
            <input type="checkbox" value="<?= $i; ?>" class="search_add_info">
            <img id="" class="svg" src="<?= base_url(); ?>theme/myown/img/icon/svg/<?= $i; ?>.svg?<?= time(); ?>" width="28">
           </div>
          <?php } ?>
          <div class="my-2">
          <div class="w-100 border border-muted my-4"></div>
           <input type="hidden" name="query_type" value="icons">
           <button type="submit" name="submit_search" class="btn btn-info btn-lg btn-rounded" value="true">Search</button>
          </div>
        </div>
        <input type="hidden" id="search_selected_additional" name="info_id_">
</form>

СКРИПТ

<script>
var _add_info = $('.search_add_selector .search_add_info').on('change', function() {
    var add_info = $('.search_add_selector .search_add_info:checked');

    var _selected = add_info.map(function() {return this.value;}).get().join(',')

    var _checkIfChecked = $('.search_add_selector_'+this.value+' .search_add_info:checked').length > 0;

    if(_checkIfChecked)
    {

     $('.search_add_selector_'+this.value).addClass('selected_info');
    }
    else
    {

     $('.search_add_selector_'+this.value).removeClass('selected_info');
    }

                    $('#search_selected_additional').val(_selected);
                });
</script>

Например: для пользователя выбрано значение 1,2,5, тогда будут отображаться только те места, которые имеют не менее 1,2,5 icon_ids. Результат должен быть: 1 4 5

IЯ использую функцию find_in_set (), она отображается очень хорошо на 1 выбранном значке.

Но для более чем двух значков отображается, даже если профиль имеет только одну характеристику.То, чего я пытаюсь достичь, - это когда пользователь ищет определенное место, где есть парковка, зоомагазин, пиво, то будут отображаться только те места, которые имеют эти характеристики.Даже если некоторые профили имеют более 3-х характеристик.

Он должен отображаться, если в профиле есть как минимум эти 3 характеристики.

Я с нетерпением жду вашей доброй помощи.Большое спасибо всем продвинутым!

1 Ответ

0 голосов
/ 14 декабря 2018

Я создал это и проверил в своей среде, и он работает как шарм:

    $this->db->select('whatever')->from('your_table');
    $this->db->group_start();
    foreach($selected_values as $value)
    {
        $this->db->where("find_in_set($value, icon_ids)");
    }
    $this->db->group_end();
    $result = $this->db->get()->result_array();

Я снова проверил его с вашими значениями, и он отлично работает (1,2,5)показывает (1,4,5)

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