本文同步至我的博客 须要掌握的 Laravel Eloquent 搜索技术,转载请注明出处。
当咱们的应用程序访问较少时(例如在项目初期阶段),直接进行项目编码就能够解决大多数问题。项目中的搜索功能也是如此,不必在一开始就引入完整的第三方类库进行搜索功能支持。大多数状况下使用 Eloquent 的查询功能就能够完成基本的搜索处理。php
搜索功能是应用的重要组成模块。优秀的设计,能够帮助咱们的用户简单快速的检索想要的信息。所以,在项目中对搜索功能的设计,不管前端仍是后端都须要提供良好的解决方案。
本文不会探讨搜索功能的前端及 UI 设计等内容。若须要学习前端在搜索设计方面的知识,能够阅读 Instant AJAX Search with Laravel and Vue 这篇文章。前端
本文将带领你们学习 MySQL 和 Eloquent 在搜索模块中设计的相关技术。vue
做为首个要讲解的搜索功能,咱们先不涉及新知识点。在 Laravel 中可使用 where 方法实现对给定字段和给定值进行比较查询,就是这样简单。mysql
<?php $results = Post::where('title', 'foo')->get();
甚至,你能够传入一个 array 到 where 方法里,对多个字段进行比较查询。它的工做原理,相似 &&(与查询) 运算符,当全部条件都为 true 时,返回结果集:laravel
<?php $results = Post::where([ ['title' => 'foo'], ['published' => true], ])->get();
若是须要实现相似 ||(或查询) 查询,则可使用 Eloquent 查询构造器提供的 orWhere 方法。git
<?php $results = Post::where('title, 'foo')->orWhere('description', 'foo')->get();
有关 where 语句的使用方法,强烈建议阅读 Laravel 「查询构造器 - Where 语句」 文档。github
如何实现模糊查询呢?即实现 MySQL 的 LIKE 查询。Eloquent 提供了比 where 语句更加灵活的模糊查询功能。经过在 where 方法中使用通配符,能够实现模糊查询功能。让咱们看看 % 通配符:ajax
<?php $keyword = 'foo'; // 获取以 foo 开始,以任何字符结尾的文章 $result = Post::where('title', 'like', '{$keyword}%')->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!sql
固然,上面的查询功能均可以在文档中找到。
JSON 类型让数据存储拥有灵活性,这个功能很赞。Laravel 中也能够轻松执行对 JSON 数据的查询,这得益于 Laravel 良好的 JSON 支持。
不过在深刻研究以前须要注意的一点是:谨记 JSON 列的存储是 区分大小写 的。
而若是咱们须要查询的数据不存在 区分大小写 的问题,能够执行相似下面的查询语句:
<?php $results = Post::where('meta->description', 'like', '%foo%')->get();
这条模糊查询语句和前面的 where 查询并没有二致,对吧?可是若是咱们的 JSON 数据存在 大小写字符 的状况,又该如何处理呢?这种场景最适合使用 whereRaw 方法,先来看看示例,再来说解它工做原理:
<?php $keyword = 'foo'; $results = Post::whereRaw('lower(meta->"$.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 如何使用这个功能。
<?php $results = Post::where('title', 'sound like', 'mistyped')->get();
提示:对 MySQL sound like 功能的支持,须要使用 5.6.8 以上的 Laravel 版本,能够查看 Laravel changelog
执行 sound like 操做,会进行一个发音类似性的算法,而后获取结果集。可是这并非咱们须要关注的,咱们仅需将待查询的字符串传给 where 语句便可。返回的结果集即会包含彻底匹配的数据,也会包含发音近似的数据。
Laravel 为咱们提供了简单实用的查询功能。咱们能够在 Laravel 里使用 where 语句,可使用原生 SQL 语句,甚至可使用模糊查询和类似查询,全部这些查询功能都是 Laravel 内置提供的开箱即用,很是赞!