devgroup / yii2-data-structure-tools
为yii2 ActiveRecord模型(树形结构、排序等)提供数据结构集合、助手和实用工具
Requires
- php: >=5.5.0
- arogachev/yii2-sortable: ^0.1.5
- devgroup/yii2-multilingual: *
- devgroup/yii2-tag-dependency-helper: ^1.3.0
- elasticsearch/elasticsearch: ^2.1
- hector68/yii2-map-input-widget: ^2.0
- kartik-v/yii2-widget-select2: ^2.0.0
- rmrevin/yii2-fontawesome: ~2.14
- unclead/yii2-multiple-input: ~1.2.3
- yiisoft/yii2: ^2.0.6
Requires (Dev)
- devgroup/dotplant-dev: ~1.0.0
- devgroup/yii2-admin-utils: dev-master
- elasticsearch/elasticsearch: ^2.1
- yiisoft/yii2-bootstrap: ^2.0@dev
This package is auto-updated.
Last update: 2024-09-11 14:53:35 UTC
README
待定
警告:此扩展正在积极开发中。请不要在生产环境中使用它!
安装
安装此扩展的首选方式是通过 composer。
运行以下命令之一
php composer.phar require --prefer-dist devgroup/yii2-data-structure-tools "*"
或在您的 composer.json
文件的 require 部分添加以下内容
"devgroup/yii2-data-structure-tools": "*"
使用方法
待定
致谢和灵感来源
搜索概念
目前它只支持 STATIC VALUES 属性存储
请注意,只有连接了 DevGroup\DataStructure\traits\PropertiesTrait
特性和 DevGroup\DataStructure\behaviors\HasProperties
行为的模型才能使用搜索。请参阅如何连接(目前为俄语)
扩展提供了灵活的搜索系统。每个属性都有一个配置点,用于切换是否在搜索中使用该属性。
基本搜索将以两种方式进行
- 对常规数据库(例如:mysql、mariadb 等)进行通用搜索;
- 对 elasticsearch 索引进行搜索。
主要功能是,如果您想使用 elasticsearch,并在应用程序配置中定义了它,但尚未对其进行配置,则您的搜索将自动切换到简单的 mysql 搜索。当您的 elasticsearch 正确启动时,搜索将自动切换到 elasticsearch。
您可以在应用程序配置文件中定义首选的搜索机制,如下所示
'modules' => [
...
'properties' => [
'class' => 'DevGroup\DataStructure\Properties\Module',
'searchClass' => \DevGroup\DataStructure\searchOld\elastic\Search::class,
'searchConfig' => [
'hosts' => ['host1:9200', 'https://host2:9200'],
'watcherClass' => MyWatch::class,
]
],
...
],
searchClass
- 用于搜索的类。如果省略,则不会配置搜索;searchConfig
- 应用到搜索对象的额外参数数组,除通用搜索外。对于 elasticsearch,可以设置以下特殊键hosts
请参阅 hosts 配置;watcherClass
- 如果需要,您可以使用自己的 elasticsearch 监视器。
如果您想开始使用 elasticsearch,首先必须 安装和配置它。
然后,如果您已经在数据库中有了条目,您可能希望生成和加载起始索引。请在控制台运行以下命令
./yii properties/elastic/fill-index
此命令将为所有允许搜索的属性创建索引。
如何搜索
目前只能对属性的静态值执行过滤
在任何位置
<?= \DevGroup\DataStructure\search\widgets\FilterFormWidget::widget([
'modelClass' => \app\models\Page::class,
'filterRoute' => ['/url/to/filter'],
'config' => [
'storage' => [
EAV::class,
StaticValues::class,
]
]
]) ?>
这将渲染包含所有属性及其在 elasticsearch 索引中包含的值的过滤器表单
'modelClass'
- 必需参数,您的应用程序中具有分配的属性及其静态值的任何模型类名称,'filterRoute'
- 必需参数,渲染过滤器表单的action
属性,'config'
- 可选,额外的配置数组。特殊键storage
将用于定义搜索将针对哪种属性存储进行。如果省略,则默认情况下搜索将仅针对StaticValues
存储进行
在您的控制器中
public function actionFilter()
{
/** @var AbstractSearch $component */
$search = \Yii::$app->getModule('properties')->getSearch();
$config = ['storage' => [
EAV::class,
StaticValues::class,
]
];
$modelIds = $search->filterByProperties(Page::class, $config, \Yii::$app->request->get('filter'));
$dataProvider = new ActiveDataProvider([
//provider config
]);
//other stuff here
}
Page
- 您的应用程序中具有分配的属性及其静态值的任何模型类名称$modelIds
将包含根据过滤器中选择的属性值找到的所有模型 ID。使用它们,您可以显示您想要的任何内容,'$config'
- 可选,额外的配置数组。特殊键storage
将用于定义存储搜索将针对哪个属性进行。如果您省略它,默认情况下搜索将仅针对StaticValues
存储进行
过滤逻辑
过滤在搜索时使用交集和并集操作。
让我们看一个例子,比如你有一个这样的过滤请求
[
1 => [2,3],
13 => [18,9,34]
]
首先这意味着我们想要找到具有属性值(id 2,3)的属性id 1的产品,以及属性id 13的属性值(18, 9, 34)。
过滤会做什么?
- 目前它将找到所有分配了id IN(2,3)值的商品;
- 然后它将找到所有分配了id IN(12,9,34)值的商品;
- 最后,它将返回这两个先前结果的交集。
如何扩展和实现
对于所有的 Search
和 Watch
机制,您可以使用自定义实现。
实际上,您可以创建并使用自己的数据库连接,例如:MongoDB
、ArangoDB
。
或者您可以直接使用自定义的 Watch
类来更新 elasticsearch 索引。
Search
和 Watch
类都是根据接口实现的,并扩展了抽象类
DevGroup\DataStructure\search\interfaces\Search
和DevGroup\DataStructure\search\base\AbstractSearch
为Search
DevGroup\DataStructure\search\interfaces\Watch
和DevGroup\DataStructure\search\base\AbstractWatch
为Watch
只需从需要的抽象类扩展您的类,并在应用程序配置中定义它,就像上面描述的那样。
如果您正在实现自定义索引,您可能需要创建自己的控制器来初始化第一次索引,例如 DevGroup\DataStructure\commands\ElasticIndexController
如有必要,在您的 Search
类中定义自己的 Watch
类。
明确创建和定义的 Watch
类将自动订阅相关系统事件。