如何在 laravel 5 中实现搜索功能和过滤器?

How to implement search feature along with filters in laravel 5?

我有多个列,我必须从中搜索内容。列就像标题和描述等。为此,我找到了 solution

但是对于这个搜索,我需要其他过滤器以及 'city' 和 'category'。我的修改方案如下:

if(isset($search_term))
    {
        $search_terms = explode(' ', $search_term);

        $fields = array('title', 'description');

        foreach ($search_terms as $term)
        {
           foreach ($fields as $field)
            {
               $cases = $cases->orWhere($field, 'LIKE', '%'. $term .'%');
            }

        }

      if (count($cases) == 0)
        $cases = NULL;

    }

if (isset($categoryID))
    {
        $cases = $cases->where('category_ID','=', $categoryID);

        }

    if (isset($cityID))
    {
        $cases = $cases->where('city_ID','=', $cityID);

    }

此代码的结果并非特定于搜索词。它正在显示所有结果。在我的案例中,我发现的问题是 orWhere() 方法。是吗?我可以使用什么替代方案?

解法:

您正在寻找的是查询的方法链接。

假设您正在搜索 Eloquent Class Cases

您的代码将是:

//This creates an object ready for queries on the DB
$caseQuery = Cases::query();

//Add conditions -- START

if(isset($search_term))
{
    $search_terms = explode(' ', $search_term);

    $fields = array('title', 'description');

    foreach ($search_terms as $term)
    {
       foreach ($fields as $field)
        {
           $caseQuery->orWhere($field, 'LIKE', '%'. $term .'%');
        }

    }
}

if (isset($categoryID))
{
    $caseQuery->where('category_ID','=', $categoryID,'AND');
}

if (isset($cityID))
{
    $caseQuery->where('city_ID','=', $cityID,'AND');

}

//Add Conditions -- END

//Fetch results

$caseResult = $caseQuery->get();


//Get Number of Results
$resultCount = $caseQuery->count();

建议:

这充其量只是一种自适应解决方案。

您需要一个本地搜索解决方案,我会向您推荐 ElasticSearch。

Elasticsearch 是一个开源搜索引擎,基于 Java。它的所有 API 都可以通过 REST 端点获得。

使用搜索引擎的优势在于它会根据相关性 对结果进行排序。 SQL 查询只会 return 所有匹配的。

弹性搜索:https://www.elastic.co/

用于 Elasticsearch 的优秀 PHP 包 Elastica:http://elastica.io/

代码如下:

    if(isset($search_term))
        {
            $search_terms = explode(' ', $search_term);

            $fields = array('id', 'title', 'case');

            $cases = $cases->where(function($q) use ($search_terms, $fields){
                    foreach ($search_terms as $term)
                    {
                       foreach ($fields as $field)
                        {
                           $q->orWhere($field, 'LIKE', '%'. $term .'%');
                        }

                    }
            });

         }

if (isset($categoryID))
    {
        $cases = $cases->where('category_ID','=', $categoryID);

        }

    if (isset($cityID))
    {
        $cases = $cases->where('city_ID','=', $cityID);

    }

在此代码中,首先执行 orWhere,然后结果将与 'city' 和 'category' 过滤器进行“与”运算。