Heim > PHP-Framework > Laravel > So lösen Sie das Problem des Laravel-Sortierfehlers

So lösen Sie das Problem des Laravel-Sortierfehlers

藏色散人
Freigeben: 2022-01-06 15:09:21
Original
2221 Leute haben es durchsucht

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.

So lösen Sie das Problem des Laravel-Sortierfehlers

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;
Nach dem Login kopieren

Problemanalyse

Die ursprünglich verwendete Abfrageanweisung lautet

$list = Article::search($words)->orderBy('created_at','desc')->paginate(10)->toArray();
Nach dem Login kopieren

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());
Nach dem Login kopieren
Datei 2:vendor/tamayo/laravel-scout-elastic/src/ElasticsearchEngine.php Zeile 211, Kartenmethode, weil wir hier die ES-Engine verwenden, wenn Sie Verwenden Sie andere, es kann anders sein, Code:

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);
    });
}
Nach dem Login kopieren

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();
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage