Помогите настроить логику для параметров расширенного поиска в PHP - PullRequest
5 голосов
/ 19 марта 2011

Я хотел бы создать форму расширенного поиска, похожую на сайт вакансий, который бы включал в себя такие критерии, как ключевое слово, тип работы, минимальная оплата, максимальная оплата, категория, подкатегория и т. Д. *

Моя проблема заключается в том, чтобы решить, как лучше всего это настроить, поэтому, если мне нужно добавить категории к параметрам, мне не нужно изменять целую кучу запросов и функций и т. Д. *

Мое лучшее предположение было бы создать некоторый ассоциативный массив из всех потенциальных параметров и повторно использовать этот массив, но по некоторым причинам я чувствую, что это намного более сложно, чем это. Я использую CodeIgniter в качестве основы MVC, если это имеет какое-либо значение.

У кого-нибудь есть предложения, как лучше всего это настроить?

Имейте в виду, мне нужно будет генерировать ссылки, такие как index.php? Keyword = designer & job_type = 2 & min_pay = 20 & max_pay = 30

Надеюсь, мой вопрос не расплывчат.

Ответы [ 9 ]

2 голосов
/ 31 марта 2011

Не знаю, нужно ли вам это, но я обычно создаю какой-то класс поиска.

<?php
$search = new Search('people');
$search->minPay(1000);
$search->maxPay(4000);
$search->jobType('IT');
$results = $search->execute();

foreach ($results as $result)
{
  //whatever you want
}

?>

Вы можете использовать все эти методы или иметь некоторое сопоставление на __set() между именем метода и полем базы данных. Параметр, передаваемый конструктору, является таблицей, в которой нужно выполнить основной запрос. В методах или сопоставлении в __set() вы должны позаботиться о любом необходимом соединении и полях для присоединения.

1 голос
/ 28 апреля 2011

Чтобы правильно использовать критерии поиска, используйте классы и интерфейсы.

Скажем, например, вы определяете интерфейс ICriteria . Затем у вас есть разные подтипы (реализации) Критерии, TimeCriteria, DateCriteria, listCriteria, TextSearch Criteria, IntRange Criteria и т. Д.

То, что должен обеспечить ваш Criteria Interface, - это метод получения и установки для каждого критерия, вам придется обрабатывать 3 варианта использования для каждого критерия:

  • как показать их
  • как заполнить запрос результатами
  • как сохранить их (в сеансе или в базе данных) для последующего использования

При показе критерия вам понадобится:

  • a этикетка
  • список доступных операторов (в, не в, =,>,> =, <, <=, содержит, не содержит) - и каждый подтип может решить, какая часть этого списка реализовано </li>
  • an запись зона (список, ввод текста, ввод даты и т. Д.)

Ваш основной код будет обрабатывать только элементы ICriteria, предлагать им создавать себя, показывать их, давать им пользовательские входные данные, запрашивать их сохранение или циклически обрабатывать их для добавления критериев SQL в запрос SQL на основе их текущих значений. Некоторые из реализаций Criteria будут наследовать другие, некоторым нужно будет только определить список доступных операторов, некоторые расширят простое поведение, чтобы добавить богатый пользовательский интерфейс (допустим, что некоторые элементы Date должны предоставлять список типа «в последний день», « за последнюю неделю ',' за последний год ',' пользовательский диапазон ').

Может быть очень хорошей идеей обрабатывать SQL-запрос как объект, а не только как строку, как, например, работает Zend_Db_Select. Поскольку каждый критерий будет добавлять свою часть в окончательный запрос, а некоторые из них могли бы добавлять leftJoins или сложные части запроса.

1 голос
/ 15 апреля 2011

Существует гораздо больше способов сделать это на уровне предприятия, но для небольшого сайта это должно быть нормально. Есть намного больше методов ActiveRecord , которые вы можете использовать по мере необходимости. CI объединит их, чтобы вы могли сделать эффективный запрос SQL.

if($this->input->get('min_pay')) {
  $this->db->where('min_pay <', $this->input->get('min_pay'));
}

if($this->input->get('keyword')) {
  $this->db->like($this->input->get('keyword'));
}

$query = $this->db->get('table_name');
foreach ($query->result() as $row) {
  echo $row->title;
}
0 голосов
/ 08 апреля 2011
    function maybeQuote($v){
        return is_numeric($v) ?: "'$v'";
    }

    function makePair($kv){
    +--  7 lines: $a = explode('=', $kv);
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    }

    function makeSql($get_string, $table){
    +-- 10 lines: $data = explode('&', $get_string);
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    }
    $test = 'lloyd=alive&age=40&weather=hot';
    $table = 'foo';
    print_r(makeSql($test, $table));
0 голосов
/ 06 апреля 2011

Agile Toolkit позволяет добавлять фильтры следующим образом (просто чтобы провести параллельное сравнение с CodeIgniter, возможно, вы можете использовать некоторые концепции):

$g=$this->add('Grid');
$g->addColumn('text','name');
$g->addColumn('text','surname');
$g->setSource('user');

$conditions=array_intersect($_GET, array_flip(
  array('keyword','job_type','min_pay'));

$g->dq->where($conditions);

$ g-> dqэто динамический запрос, где () экранирует значения, переданные из $ _GET, поэтому его можно использовать безопасно.Остальное, нумерация страниц, отображение столбцов, связь с MVC - на уровне.

0 голосов
/ 31 марта 2011

Дублировать информацию для поиска в другую таблицу.Преобразуйте наборы данных в столбцы, имеющие только два значения, например: поиск color = white ИЛИ red может стать поиском по 10 столбцам таблицы, каждый из которых содержит один цвет со значением 1 или 0. Результаты могут быть сгруппированы после, так что вы получите счетчикидля каждого поискового фильтра.Преобразуйте тексты в полнотекстовый поиск и используйте MATCH и множество индексов в этой таблице поиска.В конце концов объедините текстовые столбцы в один столбец с возможностью поиска.Результатами поиска будут идентификаторы, которые затем можно преобразовать в записи с условием IN () в SQL

0 голосов
/ 25 марта 2011

Класс пагинации - хорошая основа.Начните с сбора строковых переменных запроса.

<?php

    // ...in Pagination class

    $acceptableVars = array('page', 'delete', 'edit', 'sessionId', 'next', 'etc.');

    foreach($_GET as $key => $value) {
        if(in_array($key, $acceptableVar)) {
            $queryStringVars[] = $key . '=' . $value;
        }
    }

    $queryString = '?' . implode('&', $queryStringVars);

    $this->nextLink = $_SEVER['filename'] . $queryString;

    ?>
0 голосов
/ 23 марта 2011

Я ничего не знаю о CodeIgniter, но для поискового приложения, которое я использовал для поддержки, у нас были выпадающие списки с опциями категорий, которые хранятся в таблице базы данных, и мы полагаемся на кэширование приложения и базы данных, чтобы избежатьпоездки каждый раз, когда страница была отображена (возможность учиться сама по себе ;-).При обновлении таблицы job_type, location и т. Д. Новые значения будут отображаться в вашем поле со списком.

От

  • зависит, сколько категорий вы хотите иметь раскрывающихся списков
  • как часто вы ожидаете обновления списка
  • насколько динамично вам это нужно.

  • Размер вашего веб-сайта и общая активность - это факторы, которые вам необходимо учитывать.

Надеюсь, это поможет.

PS, поскольку вы, кажется, являетесь новым пользователем, если вы получаете ответ, который помогает вам, пожалуйста, помните, чтобы пометить его как принятый, или дать ему + (или -) в качестве полезного ответа

0 голосов
/ 19 марта 2011

Иногда поисковые запросы могут быть болезненными, но не такими большими, как нумерация страниц.К счастью, CodeIgniter помогает вам в этом с их библиотекой пагинации.

Я думаю, вы на правильном пути.Основной смысл, я бы сказал, таков:

  1. Получение переменных GET из URL.
  2. Создание запроса к базе данных (очистка значений GET).
  3. Сгенерируйте набор результатов.
  4. Выполните разбиение на страницы.

Теперь CodeIgniter уничтожает переменную GET по умолчанию, поэтому убедитесь, что вы включили строки HTTP-запроса в файле конфигурации.

Удачи!

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