laravel 정렬 실패에 대한 해결 방법: 1. "$query->whereIn(...)"을 통해 데이터를 쿼리합니다. 2. 필터를 통해 데이터를 필터링합니다. 3. 정렬된 데이터를 "$data = $scoutModelsLists; "로 설정합니다.
이 기사의 운영 환경: Windows 7 시스템, Laravel 버전 5.8, Dell G3 컴퓨터.
laravel 정렬 실패 문제를 해결하는 방법은 무엇입니까?
Laravel 5.8+scout7.0 사용 orderBy 정렬 실패 솔루션
최근 elasticSearch6.2.4를 사용하여 검색할 때 정렬 필드가 유효하지 않은 것을 발견하여 여기에 기록하겠습니다
살펴보겠습니다. 먼저 해결책, 할말은 별로 없습니다. 코드로 직접 가보세요
$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;
문제 분석
원래 사용된 쿼리 문은
$list = Article::search($words)->orderBy('created_at','desc')->paginate(10)->toArray();
위 쿼리 문에서 정렬 필드를 설정했지만 최종에서는 정렬되지 않았습니다. 분석 결과 실제로 ES 검색 결과에 나와 있는데, 최종 출력에서는 ES 데이터 구조를 컬렉션으로 변환하면 정렬 필드가 추가되지 않습니다
코드 분석
파일 1: /vendor/laravel/scout/src/builder.php 약 261줄 - Line 305
이 파일을 주의 깊게 살펴보세요. paginate와 paginateRaw 두 가지 메서드가 있습니다. 전자는 laravel 컬렉션을 반환하고 후자는 기본 쿼리를 반환합니다. es의 구조는 다음과 같습니다.
$results = $this->model->newCollection($engine->map( $this, $rawResults = $engine->paginate($this, $perPage, $page), $this->model )->all());
File 2 :vendor/tamayo/laravel-scout-elastic/src/ElasticsearchEngine.php Line 211, map 메소드입니다. 여기서는 ES 엔진을 사용하기 때문입니다. 다른 것을 사용하면 다를 수 있습니다. 코드:
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); }); }
코드 관점에서 es 검색에서 찾은 데이터가 있으면 조건을 만족하는 집합을 반환하도록 변환 및 필터링됩니다. 빈 세트가 직접 반환됩니다
파일 3: /vendor/laravel/scout/src/Searchable.php getScoutModelsByIds 메소드 약 171줄, 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(); }
이 파일이 핵심입니다. 주된 이유는 orderBy 정렬입니다. 최종 반환 시 필드가 추가되지 않았기 때문에 최종 출력에서는 es를 정렬했지만, 컴포넌트가 변경된 후 다른 곳에서 업데이트할 수 없도록 다시 재설정되었습니다. 종료. 정렬 처리가 추가되었습니다. 계획은 기사 시작 부분을 참조하세요.
당분간 종료된 내용이며, 비어 있으면 개선될 예정입니다.
최신 5개 Laravel 비디오 튜토리얼
위 내용은 laravel 정렬 실패 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!