2016-10-11 217 views

回答

4

據我瞭解的chunk()方法是使用,當你需要一個大的數據集工作,由大塊採取對數據塊的操作

從你的問題,這聽起來像你正在執行一個查詢,然後返回數據作爲JSON,所以對我來說,這聽起來不像你正在對你的數據集採取行動需要分塊。

如果你想分解返回的JSON數據,你應該看看pagination

您可以應用分頁到您的查詢,像這樣:

$data = Inspector::latest('id') 
    ->select('id', 'firstname', 'status', 'state', 'phone') 
    ->where('firstname', 'LIKE', '%' . $searchtext . '%') 
    ->paginate(); 

您可以指定每個傳遞一個號碼給PAGINATE方法集的大小:

$data = Inspector::latest('id') 
    ->select('id', 'firstname', 'status', 'state', 'phone') 
    ->where('firstname', 'LIKE', '%' . $searchtext . '%') 
    ->paginate(25); 

如果我誤解了而且你確實想要分塊,我相信你可以做到以下幾點:

$data = Inspector::latest('id') 
    ->select('id', 'firstname', 'status', 'state', 'phone') 
    ->where('firstname', 'LIKE', '%' . $searchtext . '%') 
    ->chunk(50, function($inspectors) { 
     foreach ($inspectors as $inspector) { 
      // apply some action to the chunked results here 
     } 
    }); 

Al所以,如果你返回一個雄辯的對象,它會自動轉換爲json,所以你不需要執行json_encode()據我所知。

編輯

如果我完全誤解你,你真正想要做的是這樣的:

{ 1000 records } -> this is the result of your query 

把它分解成這樣:

{ 
    { 300 records}, 
    { 300 records}, 
    { 300 records}, 
    { 100 records}, 
} 

那麼你一定要Collection的組塊方法:

$data = Inspector::latest('id') 
    ->select('id', 'firstname', 'status', 'state', 'phone') 
    ->where('firstname', 'LIKE', '%' . $searchtext . '%') 
    ->get() // now we're working with a collection 
    ->chunk(300); 

記住你不是一個Collection工作,直到你得到的查詢結果,所以如果你只需要調用chunk()就會想到一個回調,這將被應用到整個數據集,當您與Eloquent工作。

見這裏的Collectionchunk()方法這裏進一步閱讀:https://laravel.com/docs/5.3/collections#method-chunk

否則......你能不能給一些上下文你實際上在做什麼?這聽起來像你需要分頁。你對JSON數據做了什麼?你如何調用HTTP請求,是通過ajax?爲什麼一次需要全部1000條記錄?

如果您確實需要發送給客戶端的整個數據集1000,但一次只有300個數據集,那麼您不想使用塊。想想chunk()在言語的上下文中的作用,它並不是讓數據塊一次返回到客戶端,直到它具有整個數據集 - 這是爲了對一個塊應用一個動作,然後返回整個集合和使用它的一點是,它不會佔用太多的內存在一次加載整個集處理的行動。

如果你希望整個數據集一點一點地分頁,對於你的情況不起作用(我還沒有明白爲什麼!),你將需要多次調用HTTP請求來逐個獲取數據並在每個請求中指定你已有的和你需要的。

+0

我已經試過第三個答案,這是正確的,但我的問題是,如果我想要顯示1千條記錄,但它應該發送300條記錄。像第一個300,然後300,然後300,作爲JSON響應。但一次不會有一千個。 – Aamir

+0

我爲你的努力向上提出了你的答案。 :) – Aamir

+0

非常感謝..我現在有了這個概念。 :) – Aamir

2

而不是get()使用chunk()。例如, chunk(100, function($data) {})

0
  1. 可以使用變量$計數器。 並把
 

    if ($counter>=100) { break; } 

  • 可以要求查看與
  •  
    
        use path/models/User; 
        Users->chunk(100, function($users) { 
         foreach ($users as $user) { 
          // 
         } 
        });