Возврат результатов, когда параметры поиска равны нулю i Zend Lucene

У меня есть несколько полей в форме поиска. Каждое поле может быть пустым. Я строю запрос следующим образом:

$search_title = trim($_POST["search_title"]);
$search_skill = trim($_POST["search_skill"]);
$search_company = trim($_POST["search_city"]);
$search_country_id = trim($_POST["search_county_id"]);

$hits = $index->find("title:$search_title and skill:$search_skill and city:$search_city and country_id:$country_id");

Пользователь может заполнить только название, навык, город и т. д., но если какое-то поле пустое, у меня нет результата. У меня есть результат, только если все поля заполнены и совпадают. Я не получу результатов, если заполнено только одно поле, если оно равно нулю, игнорируйте это поле:

$hits = $index->find("title: and skill: and city: and country_id:$country_id");    

person Goran Radovanovic    schedule 19.03.2012    source источник
comment
Посмотрите на этот похожий вопрос, на который я ответил ранее, для идей: 9765118" title="mysql обновляет некоторые поля базы данных без перезаписи полей без изменений"> stackoverflow.com/questions/9764950/   -  person Jeremy Harris    schedule 19.03.2012


Ответы (1)


вы можете попробовать что-то вроде этого:

if ($this->getRequest()->isPost()) {
            if ($form->isValid($this->getRequest()->getPost)) {
                //get filtered and valid values from search form.
                //filter the array for set values
                $data = array_filter($form->getValues());
                //extract key => vaules as $variable = values
                extract($data);
                 $query1 = new Zend_Search_Lucene_Search_Query_MultiTerm();
                 //test for variable isset and add term to query
                 if (isset($search_title)){
                     $query1->addTerm(new Zend_Search_Lucene_Index_Term($search_title, 'title'));
                 }
                 if (isset($search_skill)){
                     $query1->addTerm(new Zend_Search_Lucene_Index_Term($search_skill, 'skill'));
                 }
                 if (isset($search_city)){
                     $query1->addTerm(new Zend_Search_Lucene_Index_Term($search_city, 'city'));
                 }
                 if (isset($search_country_id)){
                     $query1->addTerm(new Zend_Search_Lucene_Index_Term($search_country_id, 'country_id'));
                 }
                 //This should give the AND you are looking for...I hope
                 $query= new Zend_Search_Lucene_Search_Query_Boolean(array($query1), array(TRUE));
                 //get result set from query
                 $hits = $index->find($query);
            }
        }

если вы используете фильтр StringTrim в своих формах, вам не нужно будет использовать функцию trim() для ваших данных. Массив $_POST опасен для данных, предоставленных пользователем, ZF предоставляет серию методов getValues() для предоставления данных из объекта запроса (POST и GET), к которым применены указанные вами фильтры и валидаторы.
Я использовал функцию extract() в этот экземпляр, потому что я использовал getValues(), поэтому данные были отфильтрованы и проверены. Конечно, есть и другие допустимые способы присвоения key => value пар переменным. Используйте свой любимый.

person RockyFord    schedule 19.03.2012
comment
Этот запрос возвращает все: search_title ИЛИ search_skill ИЛИ search_city и т. д., но мне нужно search_title И search_skill и т. д. - person Goran Radovanovic; 20.03.2012