Lösung für Laravel-Sortierfehler: 1. Daten über „$query->whereIn(...)“ abfragen; 2. Daten über Filter filtern; 3. Die sortierten Daten auf „$data = $scoutModelsLists;“ setzen.
Die Betriebsumgebung dieses Artikels: Windows 7-System, Laravel Version 5.8, Dell G3-Computer.
Wie löst man das Problem mit Laravel-Sortierfehlern?
Laravel 5.8+scout7.0 mit orderBy Sortierfehlerlösung
Vor kurzem habe ich bei der Verwendung von elasticSearch6.2.4 für Suchvorgänge festgestellt, dass das Sortierfeld ungültig ist, daher werde ich es hier aufzeichnen
Werfen wir einen Blick darauf Zuerst die Lösung, nicht viel zu sagen. Sagen Sie, gehen Sie direkt zum Code
$list = Article::search($words)->orderBy('created_at','desc')->paginateRaw(10)->toArray(); $results = $list['data']; if ($results['hits']['total'] === 0) { return $this->model->newCollection(); } $builder =new Builder(new static(),$this->model->newModelQuery()); $keys = collect($results['hits']['hits'])->pluck('_id')->values()->all(); $query = $this->newQuery(); if ($builder->queryCallback) { call_user_func($builder->queryCallback, $query); } //查询数据 $scoutModelsLists = $query->whereIn( $this->model->qualifyColumn($this->model->getKeyName()), $keys )->orderBy('created_at','desc')->get(); //过滤数据 $scoutModelsLists->filter(function () use ($keys) { return in_array($this->model->getKey(), $keys); }); //这里为最终排序好的数据 $data = $scoutModelsLists;
Problemanalyse
Die ursprünglich verwendete Abfrageanweisung lautet
$list = Article::search($words)->orderBy('created_at','desc')->paginate(10)->toArray();
Obwohl die obige Abfrageanweisung das Sortierfeld festlegt, wird sie im Finale nicht sortiert Nach der Analyse wird es tatsächlich in den ES-Suchergebnissen gefunden. Es wird sortiert, aber in der endgültigen Ausgabe wird das Sortierfeld nicht hinzugefügt, wenn die ES-Datenstruktur in eine Sammlung konvertiert wird 1: /vendor/laravel/scout/src/builder.php Etwa 261 Zeilen – Zeile 305
Schauen Sie sich diese Datei genau an. Es gibt zwei Methoden, paginate und paginateRaw. Die erstere gibt die Laravel-Sammlung zurück und die letztere gibt die native Abfrage zurück Struktur von es. Der Unterschied zwischen den beiden Codes ist dieser $results = $this->model->newCollection($engine->map(
$this, $rawResults = $engine->paginate($this, $perPage, $page), $this->model
)->all());
public function map(Builder $builder, $results, $model) { //无数据返回空集合 if ($results['hits']['total'] === 0) { return $model->newCollection(); } //获取所有键为_id的ES数据 //$keys = collect($results['hits']['hits'])->pluck('_id')->values()->all(); //转化ES数据并过滤 return $model->getScoutModelsByIds( $builder, $keys )->filter(function ($model) use ($keys) { return in_array($model->getScoutKey(), $keys); }); }
Wenn in der es-Suche Daten gefunden werden, werden diese konvertiert und gefiltert, um einen Satz zurückzugeben, der die Bedingungen erfüllt. Ein leerer Satz wird direkt zurückgegeben
Datei 3: /vendor/laravel/scout/src/Searchable.php Etwa 171 Zeilen der getScoutModelsByIds-Methode, Code
public function getScoutModelsByIds(Builder $builder, array $ids) { //加入软删除 $query = static::usesSoftDelete() ? $this->withTrashed() : $this->newQuery(); if ($builder->queryCallback) { call_user_func($builder->queryCallback, $query); } // 重点这里,自改代码 // return $query->whereIn( // $this->getScoutKeyName(), $ids // )->orderBy('orderBy','desc')->get(); //官方代码 return $query->whereIn( $this->getScoutKeyName(), $ids )->get(); }
Diese Datei ist der entscheidende Punkt. Der Hauptgrund ist die orderBy-Sortierung Das Feld wurde bei der endgültigen Rückgabe nicht hinzugefügt, obwohl es in der endgültigen Ausgabe sortiert wurde. Um zu verhindern, dass andere Stellen nach einer Änderung der Komponente aktualisiert werden können, werden die Daten am zurückgegeben Die Sortierverarbeitung wurde hinzugefügt. Den Plan finden Sie am Anfang des Artikels.
Das ist vorerst vorbei und wird verbessert, wenn es leer ist.
Die neuesten fünf Laravel-Video-Tutorials
(empfohlen)Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem des Laravel-Sortierfehlers. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!