-
Notifications
You must be signed in to change notification settings - Fork 0
Searchable eloquent models
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;
}
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.
/** @var array */
public $searchable = ['id', 'name', 'email'];
public function buildDocument() : array
{
return [
'id' => $this->getAttribute('id'),
'name' => $this->getAttribute('name'),
'email' => $this->getAttribute('email')
];
}
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';
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';
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);