如何在 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 所有匹配的。
用于 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' 过滤器进行“与”运算。
我有多个列,我必须从中搜索内容。列就像标题和描述等。为此,我找到了 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 所有匹配的。
用于 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' 过滤器进行“与”运算。