PHPackages                             gchaumont/elastico - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. gchaumont/elastico

ActiveLibrary[Database &amp; ORM](/categories/database)

gchaumont/elastico
==================

Elasticsearch Eloquent ORM

2876[5 PRs](https://github.com/gchaumont/elastico/pulls)PHP

Since Aug 13Pushed 6d ago1 watchersCompare

[ Source](https://github.com/gchaumont/elastico)[ Packagist](https://packagist.org/packages/gchaumont/elastico)[ RSS](/packages/gchaumont-elastico/feed)WikiDiscussions main Synced 2d ago

READMEChangelogDependenciesVersions (6)Used By (0)

Elastico
========

[](#elastico)

Elasticsearch Eloquent ORM for Laravel. Extends Laravel's database layer so you can use Eloquent models, the query builder, aggregations, ILM policies, and scripted updates against Elasticsearch indices — with the same patterns you already know.

Requirements
------------

[](#requirements)

- PHP 8.2+
- Laravel 11 or 12
- Elasticsearch 8.x

Installation
------------

[](#installation)

```
composer require gchaumont/elastico
```

Configuration
-------------

[](#configuration)

Add a connection to `config/database.php`:

```
'connections' => [
    'elasticsearch' => [
        'driver' => 'elastic',
        'hosts'  => [env('ELASTICSEARCH_HOST', 'http://localhost:9200')],
        // Optional auth
        'username' => env('ELASTICSEARCH_USERNAME'),
        'password'  => env('ELASTICSEARCH_PASSWORD'),
        // Optional TLS
        'certificate' => env('ELASTICSEARCH_CERT'),
        // Optional Elastic Cloud
        'cloud' => env('ELASTIC_CLOUD_ID'),
    ],
],
```

Eloquent Models
---------------

[](#eloquent-models)

### Defining a model

[](#defining-a-model)

```
use Elastico\Eloquent\Model;
use Elastico\Index\Config;
use Elastico\Index\Mappings;
use Elastico\Mapping\Field;
use Elastico\Mapping\FieldType;

class Article extends Model
{
    protected $connection = 'elasticsearch';

    // The Elasticsearch index name
    protected $table = 'articles';

    protected $fillable = ['title', 'status', 'published_at', 'author_id', 'score'];

    public static function getIndexConfig(): Config
    {
        return Config::make('articles')
            ->mapping(fn(Mappings $m) => $m->properties(
                Field::make(FieldType::keyword, 'status'),
                Field::make(FieldType::keyword, 'author_id'),
                Field::make(FieldType::text,    'title'),
                Field::make(FieldType::date,    'published_at'),
                Field::make(FieldType::float,   'score'),
            ));
    }
}
```

### Creating and managing the index

[](#creating-and-managing-the-index)

```
php artisan elastic:index:create "App\Models\Article"
php artisan elastic:index:create "App\Models\Article" --fresh   # drop & recreate
php artisan elastic:index:delete "App\Models\Article"
```

### Basic CRUD

[](#basic-crud)

```
// Create
$article = Article::create(['title' => 'Hello', 'status' => 'draft']);

// Find
$article = Article::find('doc-id');

// Update
$article->update(['status' => 'published']);

// Delete
$article->delete();

// Upsert (creates if missing, updates if present)
Article::upsert(
    [['_id' => 'doc-1', 'title' => 'Hello', 'status' => 'draft']],
    '_id'
);
```

Query Builder
-------------

[](#query-builder)

All standard Laravel builder methods work. Elastico adds ES-specific operators:

### Filtering

[](#filtering)

```
// Equality → term query
Article::where('status', 'published')->get();

// Range → range query
Article::where('score', '>', 80)->get();
Article::where('score', '>=', 80)->where('score', '
