Laravel 8 分塊結(jié)果

2021-07-19 11:11 更新

如果你需要處理上千上萬(wàn)條數(shù)據(jù)庫(kù)記錄,你可以考慮使用 chunk 方法。該方法每次獲取結(jié)果集的一小塊,并將其傳遞給 Closure 函數(shù)進(jìn)行處理。該方法在 Artisan 命令 中處理大量查詢數(shù)據(jù)的時(shí)候非常有用。例如,我們可以將全部 users 表數(shù)據(jù)切割成一次處理 100 條記錄的一小塊:

DB::table('users')->orderBy('id')->chunk(100, function ($users) {
    foreach ($users as $user) {
        //
    }
}); 

你可以通過(guò)在 Closure 中返回 false 來(lái)終止繼續(xù)獲取分塊結(jié)果:

DB::table('users')->orderBy('id')->chunk(100, function ($users) {
    // Process the records...

    return false;
}); 

如果要在分塊結(jié)果中更新數(shù)據(jù)庫(kù)記錄,則塊結(jié)果可能會(huì)和預(yù)計(jì)的返回結(jié)果不一致。 因此,在分塊更新記錄時(shí),最好使用 chunkById 方法。 此方法將根據(jù)記錄的主鍵自動(dòng)對(duì)結(jié)果進(jìn)行分頁(yè):

DB::table('users')->where('active', false)
    ->chunkById(100, function ($users) {
        foreach ($users as $user) {
            DB::table('users')
                ->where('id', $user->id)
                ->update(['active' => true]);
        }
    }); 

注意:在分塊的回調(diào)里面更新或刪除記錄時(shí),對(duì)主鍵或外鍵的任何更改都可能影響分塊查詢。這可能會(huì)導(dǎo)致記錄沒(méi)有包含在分塊結(jié)果中。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)