djl997 / laravel-search-query-builder
A `Illuminate\Database\Query\Builder` 宏,用于轻松地在多个数据库列上进行搜索。
Requires
- php: ^8.0
- laravel/framework: ^9.0|^10.0|^11.0
README
Laravel Search Query Builder 是一个 Illuminate\Database\Query\Builder
宏,可以轻松地在多个数据库列和模型关系上进行搜索。
让我们想象一个场景,你希望返回所有在 name 或 bio
字段中有 内容 的用户。
$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
方法的最基本调用需要两个参数
- 列数组,
- 搜索值。
例如,以下查询检索那些 name
列或 bio
列的值类似于 "Cesar" 的用户。
$search = 'Cesar'; User::search(['name', 'bio'], $search)->get();
这将生成一个查询,其中 "Cesar" 是 name
或 bio
列的 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 方法(如 whereIn
、withTrashed
或 orderBy
)或您自己的宏一起使用。
$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)。有关更多信息,请参阅许可证文件。