Skip to content

Searchable eloquent models

Christopher Lorke edited this page Dec 21, 2018 · 9 revisions

Make the eloquent model searchable

Um ein eloquent model suchbar/indexierbar zu machen, muss der Searchable Trait hinzugefügt werden. Dieser beinhaltet Methoden, um Daten mithilfe von Elasticsearch effektiver und performanter zu durchsuchen.

use Illuminate\Database\Eloquent\Model;
use Triadev\Leopard\Searchable;

class Example extends Model
{
    use Searchable;
}

Speicherung von Daten

Eloquent-Models werden automatisch mit Elasticsearch synchronisiert. (Create/Update) Sollte dieses für ein Model nicht gewünscht sein, kann diese Funktionalität mit der Property-Variable $syncDocument deaktiviert werden.

/** @var bool */
public $syncDocument = false;

Um individuell zu definieren, welche Daten aus dem Eloquent Model in Dokumenten abgelegt werden soll, stehen zwei Methoden zur Verfügung.

Default: Das komplett Array aus $model->toArray() wird in einem Dokument abgelegt.

Property: $searchable

/** @var array */
public $searchable = ['id', 'name', 'email'];

Method: buildDocument()

public function buildDocument() : array
{
    return [
        'id' => $this->getAttribute('id'),
        'name' => $this->getAttribute('name'),
        'email' => $this->getAttribute('email')
    ];
}

Index

Leopard nutzt als Index für Elasticsearch die globale ENV-Variable LEOPARD_INDEX. Überschrieben werden kann der Default-Index über die Property-Variable:

/** @var string */
public $documentIndex = 'INDEX';

Type

Leopard nutzt als Type für Elasticsearch den Tabellennamen des Eloquent-Models $model->getTable(). Überschrieben werden kann der Default-Type über die Property-Variable:

/** @var string */
public $documentType = 'TYPE';

Sync relationships (foreign key)

Es kann die Situation entstehen, dass das suchbare Dokument (Elasticsearch) des Eltern-Datensatzes aktualisiert werden muss, sobald der Kind-Datensatz aktualisiert wurde. Dies kann mithilfe einer SyncRelationship getriggert werden.

Um SyncRelationships zu registrieren, muss die Funktion buildSyncRelationships() im suchbaren Eloquent-Model hinterlegt werden. Nach jedem schreiben (save()) eines Datensatzes wird geprüft, ob es eine oder mehrere SyncRelationships gibt, die aktualisiert werden müssen.

/**
 * Build sync relationships
 *
 * @return SyncRelationship[]
 */
public function buildSyncRelationships() : array
{
    return [
        SyncRelationship::create(TestModel::class)
            ->foreignKey('test_id')
            ->ownerKey('id')
    ];
}

Eine SyncRelationship spiegelt die BelongsTo-Relationship.

use Triadev\Leopard\Model\SyncRelationship;

$syncRelationship = SyncRelationship::create(CLASS);

// foreignKey: string => (default) foreign key from CLASS
$syncRelationship->foreignKey(STRING);

// ownerKey: string|null => (default) null
$syncRelationship->ownerKey(STRING);

// relation: string|null => (default) null
$syncRelationship->relation(STRING);