下面由Laravel教學專欄跟大家介紹使用chunkById方法時請不要進行排序! ,希望對需要的朋友有幫助!
使用chunkById 方法的時候請不要進行排序
最近在做開發任務的時候碰到了個詭異的問題,於是分享給大家
問題說明
由於需要批次處理數據,並且這個數據的量很大,一次全部取出然後執行是不現實的,幸運的是Laravel 為我們提供了chunkById 方法來讓我們方便的處理。偽代碼如下
Student::query() ->where('is_delete', false) ->orderBy('id', 'DESC') ->chunkById(200, function($students) { // 在这里进行逻辑处理 });
咋一眼看上去,並沒有什麼問題,但是實際執行程式碼的時候會發現 chunkById 只會執行第一次,第二次以後由於某種原因會停止執行。
找出原因
Laravel 的原始碼中chunkById 程式碼如下
public function chunkById($count, callable $callback, $column = null, $alias = null) { $column = is_null($column) ? $this->getModel()->getKeyName() : $column; $alias = is_null($alias) ? $column : $alias; $lastId = null; do { $clone = clone $this; $results = $clone->forPageAfterId($count, $lastId, $column)->get(); $countResults = $results->count(); if ($countResults == 0) { break; } if ($callback($results) === false) { return false; } $lastId = $results->last()->{$alias}; unset($results); } while ($countResults == $count); return true; }
看起來沒什麼問題,由於while 迴圈是根據$countResults == $count來判斷的,那麼我們dump 一下這兩個變數就會發現, 第一次這兩個是一致的,第二次因為資料不一致導致程式停止。
在上面的程式碼中, $count 是由$results = $clone->forPageAfterId($count, $lastId, $column)->get(); 來獲得的,
繼續查看forPageAfterId 方法
public function forPageAfterId($perPage = 15, $lastId = 0, $column = 'id') { $this->orders = $this->removeExistingOrdersFor($column); if (! is_null($lastId)) { $this->where($column, '>', $lastId); } return $this->orderBy($column, 'asc') ->take($perPage); }
我們可以看到,在這裡返回的結果是orderBy 進行升序排列的, 而我們的原始程式碼是進行降序排列,就會導致count 不一致,從而使chunkById 結束執行。
解決方案
把之前的 orderBy('id', 'desc') 移除即可。
Student::query() ->where('is_delete', false) ->chunkById(200, function($students) { // 在这里进行逻辑处理 });
總結
以後使用chunkById 或chunk 方法的時候不要加入自訂的排序
#騷到老,學到老。 。 。
以上是使用chunkById方法時請不要進行排序!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文指導建立強大的Laravel Restful Apis。 它涵蓋項目設置,資源管理,數據庫交互,序列化,身份驗證,授權,測試和關鍵的安全性最佳實踐。 解決可伸縮性chall

本文詳細介紹了Laravel實施OAuth 2.0身份驗證和授權。 它涵蓋了使用League/oauth2-server或提供商特定解決方案的軟件包,強調數據庫設置,客戶端註冊,授權服務器Configu

本文討論了使用組件在Laravel中創建和自定義可重複使用的UI元素,從而為組織提供最佳實踐並建議增強包裝。

本文討論了在雲本地環境中部署Laravel的最佳實踐,重點是可擴展性,可靠性和安全性。關鍵問題包括容器化,微服務,無狀態設計和優化策略。

本文討論了Laravel中的創建和使用自定義驗證規則,提供了定義和實施的步驟。它突出了諸如可重複性和特異性之類的好處,並提供了擴展Laravel驗證系統的方法。

在選擇PHP框架方面,Laravel和Symfony是最受歡迎和廣泛使用的選項之一。每個框架都為桌子帶來了自己的理念,特徵和優勢,使它們適合不同的項目和用例

本文討論了Laravel中的創建和使用自定義刀片指令以增強模板。它涵蓋了定義指令,在模板中使用它們,並在大型項目中管理它們,強調了改進的代碼可重複性和R等好處

本文探討了Laravel中最佳的文件上傳和雲存儲策略。 它檢查本地存儲與雲提供商(AWS S3,Google Cloud,Azure,Digitalocean),強調安全性(驗證,消毒,HTTPS)和Performance Opti


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3 Linux新版
SublimeText3 Linux最新版

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),