hamdallah90 / elasticsearch-eloquent
Elasticsearch 功能如 Laravel Eloquent 模型。
dev-master
2023-03-04 11:35 UTC
Requires
- php: ^8.2
- elasticsearch/elasticsearch: ^8.5
Requires (Dev)
- phpunit/phpunit: ^9.0 || ^9.5.21
- squizlabs/php_codesniffer: ^3.0
This package is auto-updated.
Last update: 2024-09-04 15:07:55 UTC
README
此包允许您像在 Laravel 中与 Eloquent 模型交互一样与 Elasticsearch 交互。
要求
- PHP >= 8.2
- Elasticsearch >= 8.5
安装
通过 Composer
$ composer require hamdallah90/elasticsearch-eloquent
用法
创建一个新模型
您应该重写 index
和 type
属性以确定文档路径。
use Isswp101\Persimmon\Models\BaseElasticsearchModel; use Isswp101\Persimmon\Persistence\Persistence; use Isswp101\Persimmon\Contracts\PersistenceContract; class Product extends BaseElasticsearchModel { protected string $index = 'index'; protected string|null $type = 'type'; // optional // If you have a pre-configured Elasticsearch client you can pass it here (optional) public function createPersistence(): PersistenceContract { return new Persistence($client); } }
使用静态 create()
方法在 Elasticsearch 中创建文档
$product = Product::create([ 'id' => 1, 'name' => 'Product', 'price' => 10 ]);
保存模型
$product = new Product(); $product->id = 1; $product->name = 'Product'; $product->price = 10; $product->save();
使用 save()
方法将模型数据存储在 Elasticsearch 中。让我们看看它在 Elasticsearch 中的样子
{ "_index": "index", "_type": "type", "_id": "1", "_version": 1, "_source": { "id": 1, "name": "Product", "price": 10, "created_at": "2021-03-27T11:24:15+00:00", "updated_at": "2021-03-27T11:24:15+00:00" } }
字段 created_at
和 updated_at
被自动创建。
查找现有模型
$product = Product::find(1);
如果您在 Elasticsearch 中有大量数据,您可以指定某些字段来检索
$product = Product::find(1, ['name']);
有以下方法
findOrFail()
如果未找到结果,则返回ModelNotFoundException
异常。
缓存
当您使用 find()
、findOrFail()
等方法时,会有智能模型缓存。
$product = Product::find(1, ['name']); // from elasticsearch $product = Product::find(1, ['name']); // from cache $product = Product::find(1, ['price']); // from elasticsearch $product = Product::find(1, ['price']); // from cache $product = Product::find(1, ['name']); // from cache
$product = Product::find(1); // from elasticsearch $product = Product::find(1); // from cache $product = Product::find(1, ['name']); // from cache $product = Product::find(1, ['price']); // from cache
部分更新
您可以使用部分更新快速更新特定字段。
$product = Product::find(1, ['name']); $product->name = 'Name'; $product->save(['name']);
删除模型
$product = Product::find(1); $product->delete();
您可以使用静态方法
Product::destroy(1);
模型事件
开箱即用的简单事件实现。
您可以通过重写以下方法来定义事件
saving()
在保存、更新、创建模型之前被调用saved()
在保存、更新、创建模型之后被调用deleting()
在删除模型之前被调用deleted()
在删除模型之后被调用searching()
在搜索模型之后被调用searched()
在搜索模型之后被调用
例如
use Isswp101\Persimmon\Models\BaseElasticsearchModel; class Product extends BaseElasticsearchModel { protected function saving(): bool { // Disable update if it's free return $this->price <= 0; } protected function deleting(): bool { if ($this->user_id != 1) { throw new DomainException('No permissions to delete this model'); } return true; } }
基本搜索
有一些搜索文档的辅助工具
first($query)
方法根据查询返回第一个文档或 null
。
$product = Product::first($query);
firstOrFail($query)
方法如果 first($query)
返回 null
,则返回 ModelNotFoundException
异常。
$product = Product::firstOrFail($query);
search($query)
方法根据查询返回文档。
$products = Product::search($query);
all($query)
方法根据查询返回所有文档(默认每次请求 50 项)。
$products = Product::all($query);
如果未传递 $query
,则查询将作为 match_all
查询。
查询构建器
考虑使用以下包
测试
$ composer test
许可
MIT 许可证 (MIT)。