asseco-voice / laravel-json-search
Laravel JSON搜索
Requires
- php: ^8.1
- asseco-voice/laravel-common: ^3.0
- asseco-voice/laravel-json-query-builder: ^2.0
- laravel/framework: ^10.0
Requires (Dev)
- fakerphp/faker: ^1.9.1
- mockery/mockery: ^1.4.4
- orchestra/testbench: ^8.5
- phpunit/phpunit: ^10.0
This package is auto-updated.
Last update: 2024-09-17 09:07:16 UTC
README
Laravel JSON搜索
此包在Laravel Eloquent模型上公开了一个jsonSearch
方法,提供以JSON作为输入参数的详细数据库搜索。
它对项目中的所有Eloquent模型自动运行,无需额外设置。
安装
通过composer安装包。它自动注册为Laravel服务提供者,因此无需其他操作。
composer require asseco-voice/laravel-json-search
用法
包提供了几个内置端点
- POST
/api/search/{model}
- 用于搜索 - PUT
/api/search/{model}/update
- 通过查询结果进行批量更新 - DELETE
/api/search/{model}
- 通过查询结果进行批量删除
模型应使用标准Laravel命名法(小写复数)提供,以便自动映射(例如,/api/search/contacts
以搜索Contact
模型)。
默认情况下,使用App
命名空间,但您可以在包配置中更改默认值或添加额外的端点,您可以在model_mapping
键中添加直接模型映射(优先于其他选项),或在models_namespaces
数组中添加额外值以使其更通用。
如何在配置文件中使用这些的描述。
如果内置解决方案不适合您,可以直接在控制器中实现逻辑。有关详细信息,请参阅自定义端点部分。
以下是一些示例,但搜索包的内容远不止按属性过滤。
有关详细引擎使用和逻辑的详细信息,请参阅此README。
示例
POST
调用端点并提供以下JSON
{ "search": { "first_name": "=foo;bar;!baz", "last_name": "=test" } }
这将执行SELECT * FROM some_table WHERE first_name IN ('foo, 'bar') AND first_name not in ('baz') or last_name in ('test')
。
此外,您还可以提供append
数组来解决Laravel模型上未在$appends
数组中列出的自定义属性。例如
public function getSomeAttribute() { return 'foo'; }
您可以通过以下方式返回它
{ "search": { "first_name": "=foo;bar;!baz", "last_name": "=test" }, "append": ["some"] }
您可以使用1级嵌套的appends
"append": ["relation1.append_attribute_for_r1"]
不支持多级嵌套。
请注意,这是完全未优化的,可能会引起非常慢的执行。请谨慎使用。
PUT
调用端点并提供以下JSON
{ "search": { "first_name": "=foo;bar;!baz", "last_name": "=test" }, "update": { "first_name": "new name" } }
这将执行SELECT * FROM some_table WHERE first_name IN ('foo, 'bar') AND first_name not in ('baz') or last_name in ('test')
,并在给定的结果集上执行批量更新,为每个检索到的记录提供一个新名称
。
DELETE
{ "search": { "first_name": "=foo;bar;!baz", "last_name": "=test" } }
这将执行DELETE FROM some_table WHERE first_name IN ('foo, 'bar') AND first_name not in ('baz') or last_name in ('test')
,并通过给定参数进行批量删除。
自定义端点
如果当前设置不适合您,可以创建一个自定义端点。
搜索
- 添加路由
Route::post('search', 'ExampleController@search');
- 在控制器中调用该方法,并从JSON体中提供输入参数。
public function search(Request $request) { return SomeModel::jsonSearch($request->all())->get(); }
更新
- 添加路由
Route::put('search/update', 'ExampleController@search');
- 在控制器中调用该方法,并从JSON体中提供输入参数。
public function search(Request $request) { $search = SomeModel::jsonSearch($request->except('update')); if (!$request->has('update')) { throw new Exception('Missing update parameters'); } $search->update($request->update); return $search->get(); }
删除
- 添加路由
Route::delete('search', 'ExampleController@search');
- 在控制器中调用该方法,并从JSON体中提供输入参数。
public function search(Request $request) { return SomeModel::jsonSearch($request->all())->delete(); }
搜索收藏夹
收藏夹允许您为特定用户保存搜索。
用法
- 运行
php artisan migrate
。 - 通过标准Laravel API资源路由在
/api/search-favorites
URL上使用。 - 如果您需要修改迁移,请发布包并在配置文件中将
runs_migrations
属性设置为false
。 - 如果不想在控制器中添加$
authorizeResource(SearchFavorite::class),请在asseco-search中将authorizeResource设置为false。
您可以扩展用于搜索收藏的模型并替换为自己的。确保您的模型扩展了SearchFavorite
,并在配置中将search_favorite_model
键替换为您的模型。
调试
如果您想查看调用的查询而不是结果,请取消Asseco\JsonSearch\SearchServiceProvider
中dump
行的注释。
由于Laravel查询构建器的内部工作方式,这不会输出关联查询的结果。为此,我建议使用Laravel查询日志。
扩展包
发布配置将允许您更改包的模型以及控制迁移的行为。如果扩展模型,请确保在实现中扩展原始模型。