【问题标题】:How to implement search feature along with filters in laravel 5?如何在 laravel 5 中实现搜索功能和过滤器?
【发布时间】:2015-06-15 17:30:05
【问题描述】:

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

但是通过此搜索,我还需要其他过滤器,例如“城市”和“类别”。我修改后的解决方案如下:

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() 方法。是吗?我可以使用什么替代方案?

【问题讨论】:

    标签: laravel eloquent laravel-5


    【解决方案1】:

    解决方案:

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

    假设您正在搜索 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 查询只会返回所有匹配的内容。

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

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

    【讨论】:

    • 要使LIKE 查询正常工作,请确保您的sql 表上有fulltext 索引。
    【解决方案2】:

    代码如下:

        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,然后将结果与“城市”和“类别”过滤器进行“与”运算。

    【讨论】:

      猜你喜欢
      • 2022-11-27
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多