资讯专栏INFORMATION COLUMN

需要掌握的 Laravel Eloquent 搜索技术

curried / 2607人阅读

摘要:预热搜索功能是应用的重要组成模块。本文将带领大家学习和在搜索模块中设计的相关技术。基本的查询作为首个要讲解的搜索功能,我们先不涉及新知识点。其次,在第个函数内加入了占位符,这种语法即为参数绑定,它的主要作用是用于防止注入。

本文同步至个人博客 需要掌握的 Laravel Eloquent 搜索技术,转载请注明出处。

当我们的应用程序访问较少时(例如在项目初期阶段),直接进行项目编码就可以解决大多数问题。项目中的搜索功能也是如此,没必要在一开始就引入完整的第三方类库进行搜索功能支持。大多数情况下使用 Eloquent 的查询功能就可以完成基本的搜索处理。

预热

搜索功能是应用的重要组成模块。优秀的设计,可以帮助我们的用户简单快速的检索想要的信息。因此,在项目中对搜索功能的设计,无论前端还是后端都需要提供良好的解决方案。
本文不会探讨搜索功能的前端及 UI 设计等内容。若需要学习前端在搜索设计方面的知识,可以阅读 Instant AJAX Search with Laravel and Vue 这篇文章。

本文将带领大家学习 MySQL 和 Eloquent 在搜索模块中设计的相关技术。

基本的 Eloquent Where 查询

作为首个要讲解的搜索功能,我们先不涉及新知识点。在 Laravel 中可以使用 where 方法实现对给定字段和给定值进行比较查询,就是这样简单。

get();

甚至,你可以传入一个 arraywhere 方法里,对多个字段进行比较查询。它的工作原理,类似 &&(与查询) 运算符,当所有条件都为 true 时,返回结果集:

 "foo"],
            ["published" => true],
        ])->get();

如果需要实现类似 ||(或查询) 查询,则可以使用 Eloquent 查询构造器提供的 orWhere 方法。

orWhere("description", "foo")->get();

有关 where 语句的使用方法,强烈建议阅读 Laravel 「查询构造器 - Where 语句」 文档。

使用 Like 关键字

如何实现模糊查询呢?即实现 MySQL 的 LIKE 查询。Eloquent 提供了比 where 语句更加灵活的模糊查询功能。通过在 where 方法中使用通配符,可以实现模糊查询功能。让我们看看 % 通配符:

get();

// 获取以任何字符开始,但以 foo 结尾的文章
$result = Post::where("title", "like", "%{$keyword}")->get();

// 获取包含 foo 的文章
$result = Post::where("title", "like", "%{$keyword}%")->get();

我们可以看到 Eloquent 的模糊查询功能十分灵活。即可以查询以指定字符开始或结尾的数据,也可以查询包含指定字符的数据。模糊查询在我们需要对依稀记得部分数据进行查询时非常实用。

提示:
A big note here: Probably you are using a collation that ends with _ci. That means it’s case-insensitive. Whether you type FOO, Foo, fOO, etc., you get the same result!

当然,上面的查询功能都可以在文档中找到。

在 JSON 列中搜索

JSON 类型让数据存储拥有灵活性,这个功能很赞。Laravel 中也可以轻松执行对 JSON 数据的查询,这得益于 Laravel 良好的 JSON 支持。
不过在深入研究之前需要注意的一点是:谨记 JSON 列的存储是 区分大小写 的。

而如果我们需要查询的数据不存在 区分大小写 的问题,可以执行类似下面的查询语句:

description", "like", "%foo%")->get();

这条模糊查询语句和前面的 where 查询并无二致,对吧?但是如果我们的 JSON 数据存在 大小写字符 的情况,又该如何处理呢?这种场景最适合使用 whereRaw 方法,先来看看示例,再来讲解它工作原理:

"$.description") like lower(?)", ["%foo%"]);

你会注意到这条的查询语句有些不同。

首先,除了 like 关键字外还多了些 SQL 语法,因为这里我们传入的是一条 原生 SQL 表达式
其次,在第 2 个 lower 函数内加入了 ? 占位符,这种语法即为参数绑定,它的主要作用是用于防止 SQL 注入。

如你所见,我们将一个 array 给到 whereRaw 的第二个参数,数组内的第一个元素对应第一个参数绑定占位符,第二个元素对应第二个参数绑定占位符,以此类推。
这就是 whereRaw 的工作原理。

接下来将焦点集中到真正的关键处理:我们通过 MySQL 的 lower() 函数将待查询的 JSON 数据等数据转换成小写字符,实现 不区分大小写 的查询操作。解决方案虽然实现起来较为麻烦,但工作良好。

依据单词发音进行模糊匹配

继续探讨最后一个主题,当用户输入的查询表达式包含错误的单词拼写时,该如何进行搜索呢?查询与给定的表达式有类似发音的语句是个不错的主意。这种场景我们无法使用 like 关键字,但我们有 sound like 关键字。

先不必深究 sound like 的工作原理,但如果你真的对 sound like 功能感兴趣可以阅读 MySQL SOUNDS LIKE 这篇文章。所有你感兴趣的内容它都所涉及。但现在让我们看看 Laravel 如何使用这个功能。

get();
提示:对 MySQL sound like 功能的支持,需要使用 5.6.8 以上的 Laravel 版本,可以查看 Laravel changelog

执行 sound like 操作,会进行一个发音相似性的算法,然后获取结果集。但是这并不是我们需要关注的,我们仅需将待查询的字符串传给 where 语句即可。返回的结果集即会包含完全匹配的数据,也会包含发音近似的数据。

总结

Laravel 为我们提供了简单实用的查询功能。我们可以在 Laravel 里使用 where 语句,可以使用原生 SQL 语句,甚至可以使用模糊查询和相似查询,所有这些查询功能都是 Laravel 内置提供的开箱即用,非常赞!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28624.html

相关文章

  • windows下laravel5.5手写教程2路由Eloquent ORM操作(适合初学者)

    摘要:一路由目录众所周知,对于我们熟知的任何一款框架,例如路由系统都是极其重要的存在。文件用于定义界面的路由。定义在中的路由都是无状态的,并且被分配了中间件组。生成的控制器为每个行为保留了方法,同时还包括了处理动作和的声明注释。 一、路由目录 众所周知,对于我们熟知的任何一款PHP框架,例如TP、CI、YII、路由系统都是极其重要的存在。 对于laravel框架也一样,对于数据库的操作,无非...

    BlackFlagBin 评论0 收藏0
  • laravel5.5手写教程4Eloquent ORM分页及软删除

    摘要:从而达到了软删除。不过,你可以通过在查询中调用方法来强制查询已被软删除的模型方法也可以被用在关联查询只取出软删除数据会只取出软删除数据恢复被软删除的模型有时候你可能希望取消删除一个已被软删除的模型。 Laravel 有三宝,路由、容器和 Eloquent ORM,Eloquent ORM。我个人一直比较推荐于在实际操作中学习,之前简单了解了路由和Eloquent ORM的基本用法,今天...

    mindwind 评论0 收藏0
  • 如何在 ThinkPHP 中整合 Laravel Eloquent ORM

    摘要:前言之前维护的旧项目采用的,后面学习了后,觉得的功能没有强大和方便,并想把里的用在里。好在的是独立成包的,可以用于符合要求的其他系统中。整合要使用的是。 showImg(https://segmentfault.com/img/remote/1460000009038352); 前言 之前维护的旧项目采用的 ThinkPHP 3.2,后面学习了 Laravel 后,觉得 TP 的 Mo...

    Labradors 评论0 收藏0
  • 如何使 Laravel 项目中 URL 更友好化

    说明 cviebrock/eloquent-sluggable 是一款可对 Laravel 项目中的 URL 进行友好化的扩展包。 本文章由 The EST Group 成员 @Kelvin 撰写, 首发地为 PHPHub 社区. Demo Demo 截图 showImg(http://ww1.sinaimg.cn/large/0060lm7Tgw1f2cvi683d5j30x00juad5.jp...

    JerryC 评论0 收藏0
  • Laravel 5.3 预热:10 个你需要知道变更

    摘要:本文经授权转自社区说明发布临近,大体构建已经完成,文档整理完成后即可发布。附带了一个响应式邮件模板,通知类中唯一需要做的就是像下面这样发送消息错误处理是一个可选的扩展包,提供了完整可用的服务。 本文经授权转自 PHPHub 社区 说明 Laravel 5.3 发布临近,大体构建已经完成,文档整理完成后即可发布。 下面是对 Laravel 5.3 新特性的整理,不完整列表。 1、全文搜...

    沈建明 评论0 收藏0

发表评论

0条评论

curried

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<