Hallo,
Wenn beim Erstellen von toSearchableArray
für ein bestimmtes Modell kein ID
im endgültigen Array enthalten ist, kann ich die Daten nicht mit php artisan scout:import "App\Book"
importieren. Aber wenn ich ID
einbeziehe, wird es auch für die Suche nach ID
verfügbar, was ein Verhalten ist, dem ich entgehen möchte. Was ist der richtige Weg, um die Suche nach ID
zu deaktivieren?
Beispielcode:
public function toSearchableArray()
{
$array = $this->toArray();
foreach(array_keys($array) as $key) {
//if I unset ID also, I won't be able to import table data
if(in_array($key, ['id', 'title', 'name'])) continue;
unset($array[$key]);
}
return $array;
}
Hallo @milosevicn ,
das ->toSearchableArray()
definiert die gespeicherten Daten innerhalb von MeiliSearch für ein bestimmtes Dokument (Objekt). Das Weglassen von id
führt zu nicht auffindbaren Elementen in der Suche, da id
standardmäßig der Primärschlüssel ist, der zum Identifizieren eines Dokuments verwendet wird.
Um zu verhindern, dass MeiliSearch alle Felder durchsucht, sollten Sie die Funktionalität dieses Pakets erweitern und searchAttributes
in MeiliSearch festlegen. Eine Anleitung dazu finden Sie hier .
@mmachatschek Tut
Wenn ich Dokumente mit dem Befehl php artisan scout:import
hinzufüge, funktioniert alles wie es soll, aber wenn ich dasselbe mit der /indexes/:index_uid/documents
Route ( ->addDocuments()
) mache, wird toSearchableArray()
nicht respektiert
Ich könnte dies wahrscheinlich überwinden, indem ich während der Abfrage bestimmte Spalten auswähle, aber gibt es eine Möglichkeit, die Funktion addDocuments()
selbst auf toSearchableArray()
?
Hallo @milosevicn ,
Dieses Paket ist im Grunde ein Wrapper für die MeiliSearch PHP-Bibliothek und erweitert Laravel Scout.
Beim "manuellen" Hinzufügen von Dokumenten geht die ganze Magie, die Scout bietet, zB das Hinzufügen neuer Objekte zum Index oder das Aktualisieren vorhandener mit bestimmten Feldern usw., verloren, weil Sie diese Schritte überspringen.
Gibt es eine bestimmte Absicht, wenn Sie Dokumente manuell hinzufügen?
Danke für die Antwort @mmachatschek
Ich habe eine Multi-Tenancy-App - zwei separate Apps (Vermieter und Mieter). Aus diesem Grund kann ich die vordefinierte Laravel Scout-Funktion nicht verwenden, um Dokumente automatisch zu aktualisieren, sobald etwas zur Datenbank hinzugefügt wird. Aus diesem Grund verwende ich einen Webhook, um meine Mieter-App zu informieren, wenn etwas in der Datenbank tatsächlich beim Vermieter passiert ist (bei erstellt/aktualisiert/gelöscht). Ich möchte diese Dokumente hinzufügen, sobald ich einen Webhook auf dem Mandanten erwische
@milosevicn Ich denke, du könntest einfach ein $model->touch()
. Dadurch wird die Spalte updated_at des Modells aktualisiert und das Ereignis updated
wird in der Mandanten-App ausgelöst. Der Scout-Ereignis-Listener löst dann eine Aktualisierung des Index aus. Würde das bei dir klappen?
Hilfreichster Kommentar
Hallo @milosevicn ,
das
->toSearchableArray()
definiert die gespeicherten Daten innerhalb von MeiliSearch für ein bestimmtes Dokument (Objekt). Das Weglassen vonid
führt zu nicht auffindbaren Elementen in der Suche, daid
standardmäßig der Primärschlüssel ist, der zum Identifizieren eines Dokuments verwendet wird.Um zu verhindern, dass MeiliSearch alle Felder durchsucht, sollten Sie die Funktionalität dieses Pakets erweitern und
searchAttributes
in MeiliSearch festlegen. Eine Anleitung dazu finden Sie hier .