You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:05:27