wyzheng / search-model
扩展 laravel 的 ORM 使其具有简单的搜索功能。
Installs: 1 009
Dependents: 0
Suggesters: 0
Security: 0
Stars: 5
Watchers: 1
Forks: 1
Open Issues: 0
Requires
- php: ^8.0
- laravel/framework: ^9.0|^10.0|^11.0
Requires (Dev)
- laravel/pint: ^1.10
README
安装
composer require wyzheng/search-model
使用
目前支持的查询类型有:like
, =
, >
, <
, >=
, <
, !=
, in
, between
。
常规使用
// https://example.com/api/articles?title=test&category_id=5&created_at=2020-01-01,2021-01-02&user_id=1,2,3 $articles = Article::search([, 'title' => 'like', // 声明数据库title字段模糊搜索 'category_id' => '=', // 声明数据库category_id字段精确搜索 'created_at' => 'between' // 支持get数组参数或开始和结束用逗号隔开的形式 'user_id' => 'in' // 支持get数组参数或逗号隔开的形式 ])->get();
自定义请求参数
当数据库字段和请求字段不同时,可以显式声明请求字段名
// https://example.com/api/articles?text=test&cate_id=5 $articles = Article::search([ 'title' => ['like', 'text'], 'category_id' => ['=', 'cate_id'], ])->get();
跨表查询
当查询的字段是关联表的字段时,可以使用.
的方式指定
// https://example.com/api/articles?title=test&author_name=jack $articles = Article::search([ 'title' => 'like', // 当没有显式声明请求字段时,会自动拼接author_name // 支持无限层级关联 author.company.name, 默认值 $request->input('author_company_name') 'author.name' => '=', ])->get();
自定义查询
可以通过自定义查询方法来实现更复杂的查询
// https://example.com/api/articles?title=test&type=1,2 $articles = Article::search([ 'title' => 'like', // $value = $request->input('type'); 'type' => fn ($query, $value) => $query->whereNotIn('type', explode(',', $value)), ])->get();
同时也支持自定义宏,此扩展包目前内置了一个处理时间区间查询的宏whereBetweenDate
,可以直接使用
// 自定义宏示例(已内置,可直接使用) Builder::macro('whereBetweenDate', function(string $filed, $input) { [$startDate,$endDate] = is_array($input) ? $input : explode(',', $input); return $this->whereDate($filed, '>=', $startDate) ->whereDate($filed, '<=', $endDate); }); // https://example.com/api/articles?created_at=2020-01-01,2021-01-02 $articles = Article::search([ 'created_at' => 'whereBetweenDate', // 同样也支持显式声明请求字段名 // 'created_at' => ['whereBetweenDate', 'create_time'] ])
预加载
search方法支持传入第二个参数(array),和原with使用方法一致,可以指定预加载的字段
$articles = Article::search([ 'title' => 'like', ], ['author' => function($author) { $author->select('id', 'name'); }])->get();
查询排序
本扩展包还简单实现的查询排序功能sort
// https://example.com/api/articles?title=test&sort_by=asc(id),desc(author_level) $articles = Article::search([ 'title' => 'like', ])->sort(['id', 'author_level' => function($query, $direction) { // $direction 取值 'asc' 或 'desc' $query->orderByRaw('.......') }])->get();