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