itvisionsy / es-orm
ElasticSearch PHP ORM 和查询构建器
Requires
- php: >=5.4.0
- elasticsearch/elasticsearch: >=1.0
Requires (Dev)
- phpunit/phpunit: ^5.0@dev
Replaces
- itvisionsy/es-orm: >=1
This package is not auto-updated.
Last update: 2022-02-01 12:48:32 UTC
README
这是一个简单的ElasticSearch PHP ORM映射器。
需要合作者
如果您能加入我,一起更新和维护此项目,请发送邮件至 muhannad.shelleh@live.com
需求
- PHP 5.4+
- Elasticsearch PHP SDK v>=1 and <2
- ElasticSearch服务器1.6。ES2未经测试,因此请谨慎使用。
安装
Composer
composer require itvisionsy/php-es-orm
手动下载
前往最新版本 此处 然后使用一个下载按钮下载。
如何使用?
对于查询构建器,请阅读 此README
很简单
针对每个索引的查询
- 创建一个扩展主要查询类的类(适用于通用索引)。
- 填写抽象方法。它们是自描述的。
- 使用创建的类
::find($type, $id)
,::query($type, array $query =[])
和::all($type)
。您将获得一个包含模型对象的列表,您可以访问对象属性以获取所有信息。例如,$model->name
获取名称属性,...
针对每个类型的查询
- 创建一个扩展类型查询类的类。或者创建一个扩展主要查询类并实现
TypeQueryInterface
接口和使用TypeQueryTrait
特质的类 - 填写抽象方法。它们是自描述的。
- 使用方法:
::find($id)
,::all()
和::query(array $query=[])
。您将以上述方式获得包含模型对象的列表。
请注意
方法的参数映射到原始Elasticsearch方法和参数,如下所示
::find(scalar)
和::find(scalar[])
方法分别映射到 [get](https://github.com/elastic/elasticsearch-php/blob/master/src/Elasticsearch/Client.php# L167) 和 [mget](https://github.com/elastic/elasticsearch-php/blob/master/src/Elasticsearch/Client.php# L671) 方法。::query
方法映射到 [search](https://github.com/elastic/elasticsearch-php/blob/master/src/Elasticsearch/Client.php# L1002) 方法,并且将 $query 参数原样传递,并在其中附加索引和类型参数。
查询数据
查询类只是一个简单的接口,允许您发送 DSL 查询,或执行其他 Elasticsearch 请求。例如,::query()
方法将期望接收一个包含格式良好的 DSL 查询的关联数组。
但是,您可以使用查询构建器来构建查询,并从中获取一个格式良好的 DSL 数组。
您可以使用类型查询构建器来构建查询并直接执行。
$result = TypeQuery::builder() ->where('key1','some value') ->where('key2',$intValue,'>') ->where('key3','value','!=') ->where('key4', ['value1','value2']) ->execute(); //$result is a \ItvisionSy\EsMapper\Result instance
或者您可以使用通用查询构建器来构建查询,然后可以使用其他工具对其进行修改。
//init a builder object $builder = \ItvisionSy\EsMapper\QueryBuilder::make(); //build the query using different methods $query = $builder ->where('key1','some value') //term clause ->where('key2',$intValue,'>') //range clause ->where('key3','value','!=') //must_not term clause ->where('key4', ['value1','value2']) //terms clause ->where('email', '@hotmail.com', '*=') //wildcard search for all @hotmail.com emails ->sort('key1','asc') //first sort option ->sort('key2',['order'=>'asc','mode'=>'avg']) //second sort option ->from(20)->size(20) //results from 20 to 39 ->toArray(); //modify the query as you need $query['aggs']=['company'=>['terms'=>['field'=>'company']]]; //then execute it against a type query $result = TypeQuery::query($query); //$result is a \ItvisionSy\EsMapper\Result instance
有关更详细的信息,请参阅此文件。
检索结果
返回的结果集实现了 ArrayAccess 接口,以便访问结果中的特定文档。例如:
$result = SomeQuery::all();
然后您可以获取一个文档如下所示:
$doc = $result[1]; //gets the second document
或者您可以使用点表示法如下:
$result->fetch('hits.hits.0'); //for any absolute access
访问文档数据
在模型对象上,您可以通过多种方式访问结果:
- 使用对象属性访问器
$object->attribute
- 如果属性以下划线 (_) 开头,它将首先尝试从元信息中获取它,然后是属性,然后是从内部对象属性中。
- 如果属性以前两个下划线 (__) 开头,它将首先尝试从内部对象属性中获取,然后是属性,然后是元信息。
- 如果没有下划线的优先级,它将尝试从属性中获取,然后是元信息,然后是内部对象属性。
- 使用
$object->getAttributes()[attribute]
,因为 getAttributes() 将以数组形式返回文档数据(仅第一级)。 - 使用
$object->getAttributes($attribute1, $attribute2, ...)
,这将根据请求的属性返回单个(或数组)值。
创建新文档
两种方式都可行
-
使用索引查询静态方法
IndexQuery::create(array $data, $type, $id=null, array $parameters=[])
-
使用类型查询静态方法
TypeQuery::create(array $data, $id=null, array $parameters=[])
更新文档
您可以通过以下方式更新已索引的文档:
- 通过使用相同类型和 id 的文档重新索引,或者
- 或者使用模型对象的
update(array $data, array $parameters=[])
方法
TypeQuery::find(1)->update(['new_key'=>'value','old_key'=>'new value'],[]);
删除文档
您可以使用与更新文档相同的方式删除它
- 在索引查询上调用静态方法
::delete($type, $id)
- 在模型对象上调用方法
->delete()
。
添加额外方法
您可能需要添加额外的自定义方法,如 top($numOfDocs)
或其他任何方法。为此,您需要在查询子类中将您希望创建的方法名作为受保护的创建。名称应该以前缀 _ 开头(例如 _top
),然后您可以选择:
-
使用前缀
get
调用它,所以调用_top(500)
方法,只需调用getTop(500)
,它将被映射为公共静态和公共。 -
覆盖
_allowPublicAccess
静态受保护方法以添加要公开的额外方法。请注意,在覆盖时,不要忘记与父结果合并,以免丢失旧的结果protected _allowPublicAccess(){ return array_merge(parent::_allowPublicAccess(), ['top','any',...]); }
这样,您将保存来自父级的允许方法。
扩展 Model 类
扩展 Model 类非常简单。只需扩展它!如果您正在使用命名空间,您可以通过重写 modelNamespace 公共方法在查询类中设置模型命名空间。此方法应返回以
之后,您需要在查询结果对象上调用 ->setModelClass($class)
。
示例
请检查 tests/ 文件夹。基本上,case1.php 是主文件。
\
|
+-- TestsIndexQuery (TestsIndexQuery.php) Main index query class.
| | Maps results to \Models\ namespace.
| |
| +-- \FooTypeQuery (FooTypeQuery.php) Type index query class.
| |
| +-- \BarTypeQuery (BarTypeQuery.php) Type index query class.
|
|-- Models\
|
+-- Foo (FooMode.php) Foo model class
|
+-- Bar (BarModel.php) Bar model class
许可
此代码在 MIT 许可下发布。