本文同步至个人博客LaravelEloquent需要掌握的搜索技术,转载请注明出处。当我们的应用访问较少时(比如在项目的早期阶段),直接项目编码可以解决大部分问题。项目中的搜索功能也是如此,不需要一开始就引入完整的第三方类库来支持搜索功能。在大多数情况下,基本的搜索处理可以使用Eloquent的查询功能来完成。预热搜索功能是应用程序的重要组成部分。优秀的设计可以帮助我们的用户轻松快速地检索到所需的信息。所以在项目中搜索功能的设计中,前端和后端都需要提供一个很好的解决方案。本文不讨论搜索功能的前端和UI设计。如果您需要了解前端搜索设计,可以阅读InstantAJAXSearchwithLaravelandVue一文。本文将带领大家学习MySQL和Eloquent在搜索模块中设计的相关技术。基础的EloquentWhere查询是第一个要讲解的搜索功能,新的知识点我们先不覆盖。在Laravel中,你可以使用where方法实现给定字段和给定值的比较查询,就这么简单。get();甚至,你可以将一个数组传递给where方法来比较和查询多个字段。它的工作方式类似于&&(和查询)运算符,当所有条件都为真时返回结果集:'foo'],['published'=>真],])->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();可以看出EloquentFunction的模糊查询非常灵活。即可以查询以指定字符开头或结尾的数据,也可以查询包含指定字符的数据。当我们需要查询一些我们依稀记得的数据时,模糊查询是非常实用的。提示:这里有一个重要提示:您可能正在使用以_ci结尾的排序规则。这意味着它不区分大小写。无论您键入FOO、Foo、fOO等,您都会得到相同的结果!当然,上面的查询函数都可以在文档中找到。在JSON列中搜索JSON类型提供了数据存储的灵活性,这非常好。由于Laravel对JSON的良好支持,在Laravel中也可以轻松地执行对JSON数据的查询。不过,在深入研究之前需要注意一件事:记住JSON列存储是区分大小写的。而如果我们需要查询的数据没有区分大小写的问题,我们可以执行类似下面的查询:description','like','%foo%')->get();这个模糊查询语句和之前的where查询没什么区别吧?但是如果我们的JSON数据有大小写字符,怎么办呢?这种场景最适合使用whereRaw方法。让我们先看看这个例子,然后解释它是如何工作的:"$.description")likelower(?)',['%foo%']);您会注意到此查询有点不同。首先,除了like关键字,还有更多的SQL语法,因为我们这里传入的是原生的SQL表达式。其次,一个?占位符被添加到第二个较低的功能。这种语法就是参数绑定,主要作用是防止SQL注入。可以看到,我们给whereRaw的第二个参数赋了一个数组,数组中第一个元素对应第一个参数绑定占位符,第二个元素对应第二个参数绑定占位符,以此类推。这就是whereRaw的工作原理。接下来重点关注真正的key处理:我们使用MySQL的lower()函数将需要查询的JSON数据等数据转换为小写字符,实现不区分大小写的查询操作。该解决方案虽然实施起来比较麻烦,但效果很好。基于单词读音的模糊匹配继续上一个话题,当用户输入的查询表达式包含单词拼写错误时,如何进行搜索?查找与给定表达式听起来相似的句子是个好主意。在这种情况下我们不能使用like关键字,但是我们有soundlike关键字。soundlike的工作原理没必要深究,但是如果你真的对soundlike的功能感兴趣,可以阅读MySQLSOUNDSLIKE一文。它涵盖了您感兴趣的所有内容。但现在让我们看看Laravel如何使用此功能。get();注意:要支持MySQL的读音功能,需要使用5.6.8以上的Laravel版本,可以查看Laravelchangelog进行读音操作,会进行发音相似度算法,然后得到结果集。不过这不是我们需要注意的,我们只需要将要查询的字符串传递给where语句即可。返回的结果集将包含完全匹配和相似发音的数据。总结Laravel为我们提供了简单实用的查询功能。我们可以在Laravel中使用where语句,我们可以使用原生的SQL语句,我们甚至可以使用模糊查询和类似的查询,所有这些查询功能都是Laravel开箱即用的,太棒了!
