0

0

Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】

尼克

尼克

发布时间:2025-12-26 13:45:40

|

225人浏览过

|

来源于php中文网

原创

Eloquent 模糊搜索应使用 where('field', 'like', "%{$keyword}%") 安全绑定,禁用 whereRaw 拼接;多条件搜索推荐 when() 链式调用避免嵌套。

laravel怎么实现搜索功能_laravel使用eloquent实现模糊查询与多条件搜索【实例】

where()like 做基础模糊搜索

直接在 Eloquent 查询中拼接 LIKE 是最常见写法,但要注意 SQL 注入风险。Laravel 提供了安全的参数绑定方式,别手写 "%{$keyword}%" 拼字符串。

比如搜索用户昵称包含 “admin”:

use App\Models\User;

$users = User::where('nickname', 'like', '%admin%')->get();

如果关键词来自请求,必须用变量绑定:

$keyword = $request->input('q', '');
$users = User::where('nickname', 'like', "%{$keyword}%")->get();
  • ⚠️ 错误示范:whereRaw("nickname LIKE '%{$keyword}%'") —— 无过滤时极易被注入
  • ✅ 正确做法:用 like 操作符 + 双引号包裹带百分号的变量,Laravel 自动转义
  • ? 区分大小写取决于数据库配置(如 MySQL 默认不区分,PostgreSQL 区分),需要统一可用 ilike(PostgreSQL)或 LOWER() 函数

组合多个搜索条件用 when() 避免 if 判断嵌套

当搜索表单有「用户名」「邮箱」「状态」「创建时间范围」等多个可选字段时,硬写一堆 if 会让查询构建逻辑混乱且难维护。when() 是 Laravel 专为这种场景设计的链式条件方法。

$users = User::when($request->filled('name'), function ($query) use ($request) {
    return $query->where('name', 'like', "%{$request->name}%");
})
->when($request->filled('email'), function ($query) use ($request) {
    return $query->where('email', 'like', "%{$request->email}%");
})
->when($request->filled('status'), function ($query) use ($request) {
    return $query->where('status', $request->status);
})
->when($request->filled('start_date'), function ($query) use ($request) {
    return $query->whereDate('created_at', '>=', $request->start_date);
})
->when($request->filled('end_date'), function ($query) use ($request) {
    return $query->whereDate('created_at', '<=', $request->end_date);
})
->paginate(15);
  • filled()has() 更稳妥:它排除空字符串、null0 等“假值”,避免意外匹配
  • ⚠️ 注意日期范围查询:用 whereDate() 而非 where(),否则可能因时间部分不匹配漏数据
  • ? 如果某些字段需精确匹配(如 status)、某些需模糊(如 name),混用 wherewhere(..., 'like', ...) 完全没问题,when() 只是控制是否执行那段逻辑

全文搜索替代方案:MySQL FULLTEXT 或 PostgreSQL tsvector

当数据量上万、模糊查询变慢,或需要支持“相关度排序”“同义词”“中文分词”时,纯 LIKE 就力不从心了。Laravel 本身不封装全文索引,但可调用底层能力。

AI帮个忙
AI帮个忙

多功能AI小工具,帮你快速生成周报、日报、邮、简历等

下载

MySQL 示例(需提前建 FULLTEXT 索引):

ALTER TABLE users ADD FULLTEXT(name, email);

然后在查询中用:

$keyword = $request->q;
$users = User::whereRaw("MATCH(name, email) AGAINST(? IN NATURAL LANGUAGE MODE)", [$keyword])
    ->orderByRaw("MATCH(name, email) AGAINST(?) DESC", [$keyword])
    ->get();
  • ⚠️ 中文支持弱:MySQL 原生 FULLTEXT 对中文按字切分效果差,需配合 ngram 插件或改用 Elasticsearch
  • ✅ PostgreSQL 的 to_tsvector + to_tsquery 对中文更友好(配合 zhparser 扩展)
  • ? Laravel Scout 是官方推荐的扩展方案,但它是独立服务(Algolia / Meilisearch / TNTSearch),不是“开箱即用”的 Eloquent 方法,上线前得权衡部署成本

搜索结果分页时保留查询参数

paginate() 后点击第2页,URL 里搜索关键词丢了——这是新手最常踩的坑。Laravel 的 appends() 就是干这个的。

$users = User::when(...)->paginate(15);

// 在 Blade 中渲染分页时:
{{ $users->appends(request()->query())->links() }}

更稳妥的做法是只追加关键搜索字段,避免把无关参数(如 _token)也带上:

{{ $users->appends(request()->only(['q', 'status', 'start_date', 'end_date']))->links() }}
  • ⚠️ 不要用 withQueryString()(Laravel 9+ 新增),它会无差别携带所有 query,可能暴露敏感参数
  • only() 显式声明要保留的键,清晰可控
  • ? 如果用了路由模型绑定或中间件修改了 request,确保 request()->only(...) 获取的是最终实际用于搜索的值
Eloquent 搜索看着简单,但多条件组合、参数透传、性能边界、中文支持这几处最容易出问题。尤其是 when() 的闭包里 use 变量和 paginate 后 appends 的配合,线上一疏忽就返回空结果还查不出原因。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

313

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

270

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

362

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

362

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

80

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

62

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

62

2025.08.05

数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

673

2023.10.12

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.4万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 771人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号