Laravel+jQuery Autocomplete搜索异常及城市搜索需求咨询
嘿,我来帮你搞定这三个问题,咱们逐个解决:
问题1:自动补全显示重复的会议名称(比如"conf conf")
这个问题一眼就能看出来,你在控制器组装value字段的时候,把会议名称重复拼接了一次:
'value' => $value->name . " " . $value->name
只要改成只保留一次名称就可以解决。如果之后想同时展示会议名和城市,也可以调整成更清晰的格式,比如:
'value' => $value->name . " (" . $value->city . ")"
问题2:输入"Ne"无法匹配到"Newcastle"
这是因为你的LIKE查询受数据库collation设置影响,默认区分大小写了。我们可以改成大小写不敏感的匹配,用whereRaw统一转成小写进行比较,这样不管用户输入大写还是小写关键词,都能精准匹配:
$conferences = Conference::whereRaw('LOWER(name) LIKE ?', ['%' . strtolower($search) . '%']) ->orWhereRaw('LOWER(city) LIKE ?', ['%' . strtolower($search) . '%']) ->get();
问题3:输入城市关键词时显示城市名称而非会议标题
你需要的是,当用户输入城市相关关键词时,直接展示匹配的城市名,而不是对应的会议标题。我们可以调整返回数据的逻辑,同时收集会议名和城市名并去重,这样既会显示匹配的会议,也会显示匹配的城市选项:
修改控制器里的循环部分:
$data = []; $seen = []; // 用来记录已添加的内容,避免重复 foreach ($conferences as $conference) { // 添加会议名称(去重) if (!in_array($conference->name, $seen)) { $data[] = ['id' => $conference->id, 'value' => $conference->name]; $seen[] = $conference->name; } // 添加城市名称(去重) if (!in_array($conference->city, $seen)) { $data[] = ['id' => $conference->id, 'value' => $conference->city]; $seen[] = $conference->city; } }
修改后的完整控制器代码
class AutocompleteController extends Controller { public function search(Request $request) { $search = $request->term; $conferences = Conference::whereRaw('LOWER(name) LIKE ?', ['%' . strtolower($search) . '%']) ->orWhereRaw('LOWER(city) LIKE ?', ['%' . strtolower($search) . '%']) ->get(); $data = []; $seen = []; foreach ($conferences as $conference) { if (!in_array($conference->name, $seen)) { $data[] = ['id' => $conference->id, 'value' => $conference->name]; $seen[] = $conference->name; } if (!in_array($conference->city, $seen)) { $data[] = ['id' => $conference->id, 'value' => $conference->city]; $seen[] = $conference->city; } } return response($data); } }
你的路由、jQuery代码和搜索输入框都不需要修改,保持原样即可。调整后三个问题都会解决:
- 不会再显示重复的会议名称
- 输入"Ne"能精准匹配到"Newcastle"
- 输入城市关键词时会直接展示对应的城市名称选项
内容的提问来源于stack exchange,提问作者johnW
相关产品推荐
相关产品推荐

