asseco-voice/laravel-json-search

v7.0.3 2024-06-14 15:15 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();
}

搜索收藏夹

收藏夹允许您为特定用户保存搜索。

用法

  1. 运行php artisan migrate
  2. 通过标准Laravel API资源路由在/api/search-favorites URL上使用。
  3. 如果您需要修改迁移,请发布包并在配置文件中将runs_migrations属性设置为false
  4. 如果不想在控制器中添加$authorizeResource(SearchFavorite::class),请在asseco-search中将authorizeResource设置为false。

您可以扩展用于搜索收藏的模型并替换为自己的。确保您的模型扩展了SearchFavorite,并在配置中将search_favorite_model键替换为您的模型。

调试

如果您想查看调用的查询而不是结果,请取消Asseco\JsonSearch\SearchServiceProviderdump行的注释。

由于Laravel查询构建器的内部工作方式,这不会输出关联查询的结果。为此,我建议使用Laravel查询日志。

扩展包

发布配置将允许您更改包的模型以及控制迁移的行为。如果扩展模型,请确保在实现中扩展原始模型。