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

时间:2015-04-10 05:17:31

标签: laravel eloquent laravel-5

我有多个列,我必须从中搜索这些内容。列类似于标题和描述等。为此,我找到了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()方法。是吗?我可以使用哪种替代方案?

2 个答案:

答案 0 :(得分:0)

<强>解决方案:

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

让我们说,您正在搜索一个雄辩的班级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查询将返回所有匹配的内容。

ElasticSearch:https://www.elastic.co/

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

答案 1 :(得分:0)

代码如下:

    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,然后将结果与&#39; city&#39;进行AND运算。和&#39;类别&#39;过滤

相关问题