須要掌握的 Laravel Eloquent 搜索技術

本文同步至我的博客 須要掌握的 Laravel Eloquent 搜索技術,轉載請註明出處。

當咱們的應用程序訪問較少時(例如在項目初期階段),直接進行項目編碼就能夠解決大多數問題。項目中的搜索功能也是如此,不必在一開始就引入完整的第三方類庫進行搜索功能支持。大多數狀況下使用 Eloquent 的查詢功能就能夠完成基本的搜索處理。php

預熱

搜索功能是應用的重要組成模塊。優秀的設計,能夠幫助咱們的用戶簡單快速的檢索想要的信息。所以,在項目中對搜索功能的設計,不管前端仍是後端都須要提供良好的解決方案。
本文不會探討搜索功能的前端及 UI 設計等內容。若須要學習前端在搜索設計方面的知識,能夠閱讀 Instant AJAX Search with Laravel and Vue 這篇文章。前端

本文將帶領你們學習 MySQL 和 Eloquent 在搜索模塊中設計的相關技術。vue

基本的 Eloquent Where 查詢

做爲首個要講解的搜索功能,咱們先不涉及新知識點。在 Laravel 中可使用 where 方法實現對給定字段和給定值進行比較查詢,就是這樣簡單。mysql

<?php

$results = Post::where('title', 'foo')->get();

甚至,你能夠傳入一個 arraywhere 方法裏,對多個字段進行比較查詢。它的工做原理,相似 &&(與查詢) 運算符,當全部條件都爲 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

使用 Like 關鍵字

如何實現模糊查詢呢?即實現 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 列中搜索

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 內置提供的開箱即用,很是贊!

相關文章
相關標籤/搜索