laravel 정렬 실패 문제를 해결하는 방법

藏色散人
풀어 주다: 2022-01-06 15:09:21
원래의
2186명이 탐색했습니다.

laravel 정렬 실패에 대한 해결 방법: 1. "$query->whereIn(...)"을 통해 데이터를 쿼리합니다. 2. 필터를 통해 데이터를 필터링합니다. 3. 정렬된 데이터를 "$data = $scoutModelsLists; "로 설정합니다.

laravel 정렬 실패 문제를 해결하는 방법

이 기사의 운영 환경: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿