中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

怎么解決laravel排序失效問題

這篇文章主要介紹“怎么解決laravel排序失效問題”,在日常操作中,相信很多人在怎么解決laravel排序失效問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么解決laravel排序失效問題”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創新互聯為企業級客戶提高一站式互聯網+設計服務,主要包括成都網站建設、成都網站制作、重慶App定制開發微信小程序定制開發、宣傳片制作、LOGO設計等,幫助客戶快速提升營銷能力和企業形象,創新互聯各部門都有經驗豐富的經驗,可以確保每一個作品的質量和創作周期,同時每年都有很多新員工加入,為我們帶來大量新的創意。 

laravel排序失效的解決辦法:1、通過“$query->whereIn(...)”查詢數據;2、通過filter過濾數據;3、設置排序好的數據為“$data = $scoutModelsLists;”。

本文操作環境:Windows7系統、Laravel5.8版、Dell G3電腦。

如何解決laravel排序失效問題?

Laravel 5.8+scout7.0 使用 orderBy 排序失效解決方案

最近在使用 elasticSearch7.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 行 - 305 行

仔細觀察這個文件會有兩個方法 paginate、paginateRaw ,前一個返回 laravel 集合,后一個返回 es 的原生查詢結構,

這兩者代碼的不同點在于這塊

$results = $this->model->newCollection($engine->map(
        $this, $rawResults = $engine->paginate($this, $perPage, $page), $this->model
    )->all());

文件 2:vendor/tamayo/laravel-scout-elastic/src/ElasticsearchEngine.php 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 約 171 行 getScoutModelsByIds 方法,代碼

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 排序了,這里又重置了,為防止改組件后其他地方無法更新,所以在最后返回數據時加了排序處理,方案參考文章開頭。

到此,關于“怎么解決laravel排序失效問題”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯網站,小編會繼續努力為大家帶來更多實用的文章!

分享題目:怎么解決laravel排序失效問題
分享鏈接:http://www.2m8n56k.cn/article48/iesdep.html

成都網站建設公司_創新互聯,為您提供網站策劃網頁設計公司ChatGPT微信公眾號網站設計公司關鍵詞優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站建設
主站蜘蛛池模板: 国产精品99r8在线观看 | 国产成人精品久久综合 | 国产真实乱系列2孕妇 | 亚洲第一页在线播放 | 久久99精品热在线观看15 | 大桥未久在线精品视频在线 | 亚洲免费视频网址 | 成人毛片免费播放 | 欧美一区二区三区在线观看免费 | 日韩 欧美 中文 亚洲 高清 在线 | 国产成人亚洲精品一区二区在线看 | 日本天堂网| 国产成人精品系列在线观看 | 亚洲免费在线播放 | 久久在线免费观看视频 | 亚洲性在线观看 | 久久99爱视频 | 亚洲国产激情一区二区三区 | 久久精品资源 | 香港毛片免费观看 | 国产精品久久久久国产精品三级 | 国产在线观看免费视频软件 | 久久久99视频 | 国产欧美另类久久精品91 | 2020亚洲男人天堂 | 欧美一级毛片特黄大 | 日韩二区三区 | 无毒在线 | 免费观看欧美成人禁片 | 国产精品免费视频一区二区三区 | vvvv99日韩精品亚洲 | 久久久香蕉视频 | 欧美中文字幕在线看 | 99re6热视频精品免费观看 | 一级片免| 欧美精品一区视频 | 国产亚洲精品九九久在线观看 | 国产亚洲视频在线播放大全 | 成人午夜久久精品 | 亚洲小视频在线 | 99精品视频一区在线视频免费观看 |