devgroup/yii2-data-structure-tools

为yii2 ActiveRecord模型(树形结构、排序等)提供数据结构集合、助手和实用工具

0.1 2016-05-19 10:34 UTC

This package is auto-updated.

Last update: 2024-09-11 14:53:35 UTC


README

待定

警告:此扩展正在积极开发中。请不要在生产环境中使用它!

Build Status codecov.io

安装

安装此扩展的首选方式是通过 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)值的商品;
  • 最后,它将返回这两个先前结果的交集。

如何扩展和实现

对于所有的 SearchWatch 机制,您可以使用自定义实现。

实际上,您可以创建并使用自己的数据库连接,例如:MongoDBArangoDB

或者您可以直接使用自定义的 Watch 类来更新 elasticsearch 索引。

SearchWatch 类都是根据接口实现的,并扩展了抽象类

  • DevGroup\DataStructure\search\interfaces\SearchDevGroup\DataStructure\search\base\AbstractSearchSearch
  • DevGroup\DataStructure\search\interfaces\WatchDevGroup\DataStructure\search\base\AbstractWatchWatch

只需从需要的抽象类扩展您的类,并在应用程序配置中定义它,就像上面描述的那样。

如果您正在实现自定义索引,您可能需要创建自己的控制器来初始化第一次索引,例如 DevGroup\DataStructure\commands\ElasticIndexController

如有必要,在您的 Search 类中定义自己的 Watch 类。

明确创建和定义的 Watch 类将自动订阅相关系统事件。