djl997/laravel-search-query-builder

A `Illuminate\Database\Query\Builder` 宏,用于轻松地在多个数据库列上进行搜索。

1.2.0 2024-03-02 11:09 UTC

This package is auto-updated.

Last update: 2024-10-01 00:15:01 UTC


README

Latest Version on Packagist Total Downloads Software License

Laravel Search Query Builder 是一个 Illuminate\Database\Query\Builder 宏,可以轻松地在多个数据库列和模型关系上进行搜索。

让我们想象一个场景,你希望返回所有在 namebio 字段中有 内容 的用户。

$search = 'Cesar';

// vanilla laravel
User::where('name', 'LIKE', '%'. $search .'%')->orWhere('bio', 'LIKE', '%'. $search .'%')->get();

// laravel with laravel-search-query-builder package
User::search(['name', 'bio'], $search)->get();

在 Laravel 中,这个例子并不难实现,但如果你还想在模型关系(如帖子或评论)中进行搜索,它可能会迅速增长。

让我们看看 Laravel Search Query Builder 包如何改善这种情况。

要求

Laravel Search Query Builder 需要 PHP 8+ 和 Laravel 9+。

安装

您可以通过 composer 安装此包

composer require djl997/laravel-search-query-builder

使用

基本搜索词

search 方法的最基本调用需要两个参数

  1. 列数组,
  2. 搜索值。

例如,以下查询检索那些 name 列或 bio 列的值类似于 "Cesar" 的用户。

$search = 'Cesar';

User::search(['name', 'bio'], $search)->get();

这将生成一个查询,其中 "Cesar" 是 namebio 列的 LIKE 操作。为了说明,搜索词被包裹在 %...% 中,以检查字符串(的一部分)是否存在。

多个搜索词

您也可以通过逗号分隔一次执行多个搜索。

$search = 'Cesar, Victoria';

User::search(['name', 'bio'], $search)->get();

这将生成针对搜索词每个部分的查询,默认情况下在逗号上拆分。

更改分隔符

如果您想更改分隔符,可以通过更改第三个参数来实现。

User::search(['name', 'bio'], 'Cesar Victoria', '|')->get();

这将生成针对搜索词每个部分的查询,在 | 上拆分。

搜索多个关系

如您所知,whereHas 方法提供了很多额外的查询约束定义功能。没错,您也可以在这里使用 search 方法。

例如,以下查询将返回所有在 bios 中包含 "Laravel is cool" 的用户 + 所有撰写包含此短语标题或正文的帖子的用户。

$search = 'Laravel is cool';

User::search(['bio'], $search)
    ->orWhereHas('posts', function($query) use ($search) {
        $query->search(['title', 'body'], $search);
    })
    ->get();

将搜索与其他查询结合使用

由于 search 方法被开发成宏并扩展 Illuminate\Database\Query\Builder,因此它可以与任何其他 Builder 方法(如 whereInwithTrashedorderBy)或您自己的宏一起使用。

$search = 'Laravel is cool';

User::whereIn('role', ['author', 'reviewer'])
    ->where(function($query) { //see note below
        ->search(['bio'], $search)
        ->orWhereHas('posts', function($query) use ($search) {
            $query
                ->search(['title', 'body'], $search)
                ->whereNotNull('published_at');
        })
        ->orWhereHas('comments', function($query) use ($search) {
            $query->search(['body'], $search);
        })
    })
    ->withTrashed()
    ->orderBy('name')
    ->get();

这将返回一个按名称排序的用户列表,其中包含作者或审阅者角色(已删除和未删除),在 bios 中包含 "Laravel is cool",已发布帖子或评论。

注意! 搜索查询被包裹在一个 where 查询中,因为您可能不希望 'orWheres' 跳过任何其他过滤器。

动态列搜索

这是一个如何使列动态化的简短示例

<input type="text" name="search" value="Laravel is cool"/>
<input type="checkbox" name="userColumns[]" value="name"/>
<input type="checkbox" name="userColumns[]" value="bio"/>
$search = $request->input('search');
$columns = $request->input('userColumns');

User::search($columns, $search)->get();

变更日志

请参阅 GitHub 发布信息,了解最近的变化。

贡献

欢迎贡献或提出建议。

许可

MIT 许可证(MIT)。有关更多信息,请参阅许可证文件