使用 Laravel 6 等 Eloquent Collection 類(lèi)。所以我有“很多”數(shù)據(jù)需要處理。大約 5000 行,在獲取它時(shí),會(huì)生成一個(gè)包含 5000 個(gè)模型的集合?,F(xiàn)在,每個(gè)模型可能都有 20 個(gè)屬性需要讀取。有沒(méi)有快速的方法來(lái)做到這一點(diǎn)?我目前有一個(gè)要讀取的屬性數(shù)組,然后像這樣設(shè)置循環(huán):\fopen()...foreach ($models as $model) { $row = []; foreach ($this->attributes as $attr) { $row[] = \data_get($model, $attr); } \fputcsv($fh, $row);}\fclose()...$models是一個(gè) Laravel 集合,由其中創(chuàng)建,EloquentModel::find($ids);其中$ids是整數(shù)數(shù)組。(來(lái)自數(shù)據(jù)庫(kù)的 5000 個(gè) ID)$this指的是包含 foreach 循環(huán)的類(lèi)。attributes除了包含上面代碼的函數(shù)和只是一個(gè)字符串?dāng)?shù)組的屬性之外,這個(gè)類(lèi)中沒(méi)有其他任何東西。對(duì)于 5000 行,每行循環(huán) 20 個(gè)屬性,這可能需要很長(zhǎng)時(shí)間來(lái)處理,并且在每種情況下,這實(shí)際上都會(huì)拋出FatalErrorException: Allowed memory size of 134217728 bytes exhausted那么檢索每行屬性集的最快方法是什么?我個(gè)人想不出比這個(gè)嵌套循環(huán)更快的循環(huán)了。此外,看到\fputcsv()將每一行寫(xiě)入文件,并且$row變量在每個(gè)循環(huán)中被覆蓋,為什么我仍然得到Allowed memory size exhausted?LazyCollection 是這里的解決方案嗎?
1 回答

紫衣仙女
TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
這將一次處理 200 個(gè)塊中的模型,從而節(jié)省大量?jī)?nèi)存。
Model::whereIn('id', $ids)->chunk(200, function($models){
foreach ($models as $model) {
$row = [];
foreach ($this->attributes as $attr) {
$row[] = \data_get($model, $attr);
}
\fputcsv($fh, $row);
}
});
- 1 回答
- 0 關(guān)注
- 106 瀏覽
添加回答
舉報(bào)
0/150
提交
取消