本文旨在解决 laravel 8 中使用 eloquent orm 进行多词模糊搜索时遇到的挑战,特别是当搜索词包含多个单词(如姓名和姓氏)时无法正确匹配的问题。通过介绍一种将搜索短语分词并结合 `orwhere` 语句进行动态查询的策略,实现更灵活、准确的数据库搜索功能。
在 Laravel 中,当我们需要在多个数据库字段中执行模糊搜索时,通常会使用 where 或 orWhere 结合 LIKE 操作符。例如,以下代码片段展示了在多个字段中搜索单个关键词的常见做法:
$query = Immovable::query()
->leftJoin('streets', 'streets.gus_id', '=', 'immovables.street_gus_id')
->select(
'immovables.id',
'immovables.street_gus_id',
'immovables.building_number',
'immovables.apartment_number',
'streets.name as street_name'
);
if (request()->has('search')) {
$searchTerm = "%" . request()->search['value'] . "%";
$query->where('streets.name', 'like', $searchTerm)
->orWhere('immovables.community', 'like', $searchTerm)
// ... 其他 orWhere 条件
->orWhere('immovables.name', 'like', $searchTerm)
->orWhere('immovables.surname', 'like', $searchTerm);
}
$results = $query->get();这种方法对于单个单词的搜索(例如,搜索 "Karol" 或 "Krawczyk")是有效的。然而,当用户输入包含多个单词的搜索短语(例如 "Karol Krawczyk")时,上述代码会将其作为一个整体进行匹配。这意味着数据库将尝试查找一个字段中同时包含 "Karol Krawczyk" 整个字符串的记录。如果 "Karol" 在 immovables.name 字段,而 "Krawczyk" 在 immovables.surname 字段,或者它们分散在不同的字段中,那么这种整体匹配的方式将无法返回任何结果,从而导致搜索失败。
要解决这个问题,我们需要将用户输入的搜索短语拆分成独立的单词,并对每个单词在所有目标字段中执行独立的模糊匹配。
为了实现更灵活的多词搜索,我们可以采取以下策略:
同字段上的匹配条件。以下是优化后的 Laravel 查询代码,它演示了如何实现上述策略:
use Illuminate\Http\Request;
use App\Models\Immovable; // 假设您的模型名为 Immovable
class SearchController extends Controller
{
public function search(Request $request)
{
$query = Immovable::query()
->leftJoin('streets', 'streets.gus_id', '=', 'immovables.street_gus_id')
->select(
'immovables.id',
'immovables.street_gus_id',
'immovables.building_number',
'immovables.apartment_number',
'streets.name as street_name'
);
if ($request->has('search') && !empty($request->search['value'])) {
// 将搜索值按空格拆分成多个单词
$searches = explode(" ", $request->search['value']);
// 使用一个闭包来分组所有的 OR 条件,确保逻辑清晰
$query->where(function ($q) use ($searches) {
foreach ($searches as $search) {
$searchTerm = "%" . $search . "%"; // 为每个单词构建模糊匹配字符串
// 对每个单词在所有相关字段中执行 OR 匹配
$q->orWhere('streets.name', 'like', $searchTerm);
$q->orWhere('immovables.community', 'like', $searchTerm);
$q->orWhere('immovables.city', 'like', $searchTerm);
$q->orWhere('immovables.building_number', 'like', $searchTerm);
$q->orWhere('immovables.granted_comments', 'like', $searchTerm);
$q->orWhere('immovables.inspections', 'like', $searchTerm);
$q->orWhere('immovables.oze_installations', 'like', $searchTerm);
$q->orWhere('immovables.pesel', 'like', $searchTerm);
$q->orWhere('immovables.name', 'like', $searchTerm);
$q->orWhere('immovables.surname', 'like', $searchTerm);
$q->orWhere('immovables.email1', 'like', $searchTerm);
$q->orWhere('immovables.email2', 'like', $searchTerm);
$q->orWhere('immovables.email3', 'like', $searchTerm);
$q->orWhere('immovables.phone1', 'like', $searchTerm);
$q->orWhere('immovables.phone2', 'like', $searchTerm);
$q->orWhere('immovables.phone3', 'like', $searchTerm);
$q->orWhere('immovables.description', 'like', $searchTerm);
}
});
}
$results = $query->get();
return view('your.view', compact('results')); // 假设您将结果传递给视图
}
}通过将用户输入的搜索短语进行分词,并结合 Laravel Eloquent 的 orWhere 闭包和循环结构,我们可以有效地实现多词模糊搜索功能。这种方法解决了单一 LIKE 匹配无法处理多单词搜索的局限性,使得搜索结果更加灵活和符合用户预期。然而,对于大规模应用,仍需权衡性能,并考虑引入更专业的全文搜索解决方案。
# mysql
# laravel
# 前端
# go
# 大数据
# app
# ai
# sql
# foreach
# 封装
# 字符串
# 循环
# 闭包
# 并发
# function
# elasticsearch
# 数据库
# solr
# 关键词
# 多个
# 遍历
# 您的
# 搜索功能
# 我们可以
# 搜索结果
# 这种方法
# 通常会
# 并结合
相关文章:
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
建站之星下载版如何获取与安装?
建站之星CMS五站合一模板配置与SEO优化指南
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
宝塔面板创建网站无法访问?如何快速排查修复?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
高端建站如何打造兼具美学与转化的品牌官网?
如何做网站制作流程,*游戏网站怎么搭建?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
网站微信制作软件,如何制作微信链接?
如何高效搭建专业期货交易平台网站?
文字头像制作网站推荐软件,醒图能自动配文字吗?
如何在云主机快速搭建网站站点?
如何在建站主机中优化服务器配置?
微信推文制作网站有哪些,怎么做微信推文,急?
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
网站代码制作软件有哪些,如何生成自己网站的代码?
济南企业网站制作公司,济南社保单位网上缴费步骤?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
如何打造高效商业网站?建站目的决定转化率
建站之星如何快速解决建站难题?
历史网站制作软件,华为如何找回被删除的网站?
长沙企业网站制作哪家好,长沙水业集团官方网站?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
浅析上传头像示例及其注意事项
定制建站哪家更专业可靠?推荐榜单揭晓
网站制作服务平台,有什么网站可以发布本地服务信息?
北京专业网站制作设计师招聘,北京白云观官方网站?
建站主机SSH密钥生成步骤及常见问题解答?
西安大型网站制作公司,西安招聘网站最好的是哪个?
网站制作价目表怎么做,珍爱网婚介费用多少?
如何基于云服务器快速搭建个人网站?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
已有域名能否直接搭建网站?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
大连网站制作公司哪家好一点,大连买房网站哪个好?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
定制建站如何定义?其核心优势是什么?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
简单实现Android文件上传
电商网站制作公司有哪些,1688网是什么意思?
宝塔建站无法访问?如何排查配置与端口问题?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。