解決Laravel中chunk方法分塊處理數據的坑

昨天在寫腳本的時候,發現了一個問題,當我去分塊去處理數據的時候,數據表的數據老是會出現缺失處理的狀況。 在這裏寫個筆記 記錄下此次的踩坑過程。 網上有好多地方能看到這個坑,可是都沒有給出具體的解決方案。 this

Laravel中chunk方法分塊處理數據的坑: Laravel中chunk方法分塊處理數據code

先說會引起這個問題的緣由: 主要是由於數據表的查詢與更新的where字段自同一張表,那麼咱們在更新數據的時候,就會由於chunk的分塊機制,致使查詢的數據是不全的。get

這是chunk的分塊機制源碼:源碼

public function chunk($count, callable $callback)
{
    // 我理解的是相似於limit,offset 實現數據分頁查詢  
    $results = $this->forPage($page = 1, $count)->get();

    while (count($results) > 0) {
        // On each chunk result set, we will pass them to the callback and then let the
        // developer take care of everything within the callback, which allows us to
        // keep the memory low for spinning through large result sets for working.
        // 若是用戶回調中,更新的字段與查詢的字段是一個條件,就會出現這樣的問題             
        if (call_user_func($callback, $results) === false) {
            return false;
        }

        $page++;

        $results = $this->forPage($page, $count)->get();
    }

    return true;
}

那麼如何解決這種問題呢? 我是這麼處理的:it

public function handle()
{
    // 1.先去查詢須要更新的數據量 
    $count = DB::table('table')
               ->where('status', '=', 0)
               ->count();
    echo "須要推送的數量:$count\r\n";
    while ($count) {
        // 2.而後limit去查數據 
        $data= DB::table(self::OPEN_API_WUBA_TEST_CLUE)
                 ->where('is_push', '=', self::IS_PUSH_FAILED)
                 ->limit(100)
                 ->get();
        ! empty($data) && $this->processData($data);
        // 3.批次處理完數據,再去查詢下 須要更新的數據,直到更新完畢退出循環  
        $count = DB::table('table')
                   ->where('status', '=', 0)
                   ->count();
        echo "剩餘推送的記錄數:$count\r\n";
    }
    exit("數據所有推送完畢.\r\n");

}

private function processData($data)
{
    // TODO(xiaoyi):處理數據業務邏輯
}
相關文章
相關標籤/搜索