我在我的主页上有一个搜索栏,用户可以在其中输入信息,如果它匹配一个标签,它将显示链接到该标签的服务(例如:搜索支持,它将显示到it支持页面的链接)
每个标签都存储在数据库中单独的单元格中,该单元格具有链接到所选服务的唯一id。在用户在同一搜索栏中输入两个标签而没有返回任何结果之前,这种方法非常有效。
$action = (isset($_POST['action'])) ? $_POST['action'] : '';
$searchTerm = (isset($_POST['search_term'])) ? $_POST['search_term'] : '';
if($searchTerm != "" && $action == "service-search"){
$query = $modx->newQuery('Service');
$query->select($modx->getSelectColumns('Service','Service','',array('id', 'subject', 'link', 'target')));
$query->leftJoin('ServiceTag', 'ServiceTag', 'Service.id = ServiceTag.service_id');
$query->leftJoin('Tag', 'Tag', 'Tag.tag_id = Tag.id');
$query->where(array(
array(
'OR:Tag.tag:LIKE' => '%' .$searchTerm. '%'
),
array(
'AND:Tag.published:=' => 1,
'AND:Tag.deleted:=' => 0,
'AND:Service.published:=' => 1,
'AND:Service.deleted:=' => 0
)
));
$query->sortby('Service.subject','ASC');
$query->limit(10);
$suggestions = $modx->getCollection('Service', $query);
if(count($suggestions) > 0){
foreach($suggestions as $suggestion) {
$listItems[] = array(
"label"=>$suggestion->get('subject'),
"link"=>$suggestion->get('link'),
"target"=>$suggestion->get('target')
);
}
}else{
$listItems[] = array(
"label"=>"no results found",
"link"=>"/services",
"target"=>""
);
}
return json_encode($listItems);
}
我有这段PHP代码我相信它是
这行'OR:Tag.tag:LIKE' => '%' .$searchTerm. '%'
需要修改,以处理多个$searchTerms。在过去的几天里,我一直试图让这个工作,但没有运气!
如果$searchTerm中有多个单词,则必须将它们分开并为每个单词添加LIKE语句。
假设$searchTerm中有"foo bar",你检查:WHERE标签像"%foo bar%",但没有标签"foo bar"。
你必须检查:WHERE (tag LIKE "%foo%"或tag LIKE "%bar%")
$searchTermSplit = $searchTerm;
$pieces = explode(" ", $searchTermSplit);
$wordOne = $pieces[0];
$wordTwo = $pieces[1];
与
'WHERE:Tag.tag:LIKE' => '%' .$searchTerm. '%',
'OR:Tag.tag:LIKE' => '%' .$wordOne. '%' .$wordTwo. '%'
这似乎工作得很好,谢谢大家:)