主页/PHP笔记/PHP问答/框架Laravel/Laravel Eloquent:如何实现大小写不敏感搜索

Laravel Eloquent:如何实现大小写不敏感搜索

Bug编译狮

Bug编译狮

在 Laravel 中使用 Eloquent 进行大小写不敏感的搜索,可以通过自定义查询方法来实现。以下是一个示例代码,展示了如何实现这一点:

假设我们有一个名为 Product 的模型,并且我们希望在进行搜索时忽略大小写。

  1. 创建一个新的查询方法: 在 Product 模型中,创建一个新的查询方法 searchInsensitive
namespace AppModels;

use IlluminateDatabaseEloquentModel;
use IlluminateSupportFacadesDB;

class Product extends Model
{
    public function searchInsensitive($query)
    {
        return DB::table('products')
            ->whereRaw("LOWER(title) LIKE LOWER('%{$query}%')")
            ->get();
    }
}
  1. 在控制器中使用这个方法: 在控制器中调用 searchInsensitive 方法并传递要搜索的查询字符串。
namespace AppHttpControllers;

use AppModelsProduct;
use IlluminateHttpRequest;

class ProductController extends Controller
{
    public function index(Request $request)
    {
        $query = $request->input('query');

        if ($query) {
            $products = Product::searchInsensitive($query)->get();
        } else {
            $products = Product::all();
        }

        return view('products.index', ['products' => $products]);
    }
}
  1. 在视图中显示结果: 在视图文件中显示搜索结果。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Search Results</title>
</head>
<body>
    <h1>Search Results</h1>
    <form action="/products" method="GET">
        <input type="text" name="query" placeholder="Search...">
        <button type="submit">Search</button>
    </form>

    <ul>
        @foreach ($products as $product)
            <li>{{ $product->title }}</li>
        @endforeach
    </ul>
</body>
</html>

通过这种方式,你可以实现大小写不敏感的搜索功能。这种方法利用了 Eloquent 的 whereRaw 方法和数据库的 LOWER 函数来确保搜索是不区分大小写的。

黑板Bug讲师

黑板Bug讲师

概览

Laravel,这个优雅的PHP框架以其通过Eloquent ORM带来的数据库操作的简洁性而闻名。在搜索功能中常见的一个关键特性是提供用户友好的查询体验所需的不区分大小写的功能。本文将探讨如何使用Laravel Eloquent实现各种方式的不区分大小写的搜索,从最简单的方法到更高级的策略。

在SQL中,区分大小写是一种常见的特性。这意味着相同的字符组合可能会根据其大写字母或小写字母的排列顺序产生不同的值。 例如,在MySQL数据库中,”SELECT FROM table WHERE column = ‘Hello’;” 和 “SELECT FROM table WHERE column = ‘hello’;” 这两条查询语句的结果可能不同,因为它们在列名和值上使用了不同的字母大小写。

在开始之前,需要注意的是,在搜索查询中对大小写的依赖取决于数据库或您要查询的特定列的排序集。例如,MySQL 的默认排序集是 ‘utf8mb4_general_ci’,其中 ‘ci’ 表示不区分大小写,但如果您使用的是 ‘utf8mb4_bin’ 对于二进制,则搜索将是区分大小写的。

基本实现

在实施Laravel Eloquent的不区分大小写的搜索时的第一步是使用内置的方法。LIKE运营商。当数据库的排序规则为不区分大小写时,这个简单的查询就足够了:

$users = User::where('name', 'LIKE', "%$searchTerm%")->get();

这种方法在具有不区分大小写的排序规则的SQL数据库中可以正常工作。然而,如果你的数据库或列本身有区分大小写的排序规则,你需要确保对列值和搜索词都进行大小写处理。

强制不区分大小写

要手动强制进行不区分大小写的搜索,可以使用SQL的特性。LOWER()哦,是的。UPPER()功能:

$users = User::whereRaw('LOWER(name) LIKE LOWER(?)', ["%$searchTerm%"])
             ->get();

这样做会先将列值和搜索词转换为小写,从而忽略字母的大小写差异。请确保将搜索词作为参数绑定到查询中而不是直接插入,以防止SQL注入攻击。

自定义eloquent范围

正在使用。LOWER()and 是“和”的意思。UPPER()在您的查询中可能会重复出现。重构这段逻辑到可重用的范围会更高效:

use IlluminateDatabaseEloquentBuilder;

trait Searchable {
    public function scopeInsensitiveSearch(Builder $query, $column, $value) {
        return $query->whereRaw('LOWER(' . $column . ') LIKE ?', ['%' . strtolower($value) . '%']);
    }
}

在定义了特性后,你可以将其应用于Eloquent模型:

class User extends Model {
    use Searchable;

    // Use the scope like so:
    $users = User::insensitiveSearch('name', $searchTerm)->get();
}

这是在应用的Eloquent模型上进行不区分大小写的搜索的一种整洁且可重用的方法。

高级:自定义数据库函数

如果需要处理大量文本数据且在应用中核心功能之一是进行不区分大小写的搜索,那么采用更高级别的解决方案是有道理的。例如,可以定义自定义数据库函数或使用PostgreSQL提供的ILIKE扩展来实现不区分大小写的匹配:

$users = User::where('name', 'ILIKE', "%$searchTerm%")->get();

请注意,使用数据库特定的功能和特性会降低应用程序在不同SQL数据库系统之间移植的灵活性。

使用搜索引擎

最终,如果您的应用需要进行大规模的搜索操作,可以考虑使用专门设计用于支持模糊搜索和提供额外好处(如拼写容忍、分类等)的搜索引擎,例如Algolia或Elasticsearch。

在使用 Laravel Scout 时,集成这些搜索引擎变得轻而易举。在您的应用配置文件中配置搜索驱动后,就可以轻松地进行操作了。config/scout.php您可以使用以下方式搜索:

$users = User::search($searchTerm)->get();

在后端,Laravel Scout会处理复杂性,而您则可以享受选择的搜索引擎的强大功能。

结论

在Laravel Eloquent中实现不区分大小写的搜索可以通过简单的原生SQL操作或使用第三方搜索引擎来实现,具体取决于项目的需求。根据本文中的策略,你可以优化Laravel应用程序的搜索功能以提高用户体验并避免大小写敏感问题。

长工码奴1523

长工码奴1523

在 Laravel 中使用 Eloquent ORM 实现大小写不敏感的查询时,你可以使用 LIKE 操作符来匹配字符串中的任意字符,并且不区分大小写。

以下是如何设置和执行大小写不敏感搜索的一个例子:

// 假设我们有一个名为 "users" 的模型

$users = User::where('name', 'like', '%John%')->get();

foreach ($users as $user) {
    echo $user->name . "n";
}

在这个例子中:

  • User 是我们的用户模型。
  • where 方法用于根据条件筛选数据。
  • 'name' like '%' John%' 表示我们需要查找名称中包含 “John” 且大小写不敏感的所有记录。

这将返回所有名称包含 “John” 且大小写不敏感的用户的记录。

请注意,这种方法假设字段是大写的,如果它们是小写的,你需要将 lower() 函数应用于字段名。例如:

$users = User::where('name', 'like', '%john%')->get();

这样可以确保所有的搜索都是大小写不敏感的。