Yang saya maksud dengan itu - apakah ada cara untuk melakukannya:
$collection = $model->getCollection();
foreach ($collection as $item) {
$item->doStuff();
}
Sedemikian rupa sehingga bahkan jika koleksi memiliki 100 ribu baris, itu hanya akan memuat satu halaman baris pada satu waktu dari MySQL dan secara ajaib paginasi mereka untuk Anda di belakang layar.
Dari melihat Varien_Data_Collection_Db::load()
itu sepertinya tidak mungkin, tetapi hanya ingin memeriksanya. Ini sepertinya sesuatu yang harus menjadi kebutuhan bersama.
performance
collection
kalenjordan
sumber
sumber
setPageSize
karena semantik.core/resource_iterator
solusi tersebut sebenarnya tidak memberi peringkat pada permintaan mysql. Ini memuat seluruh hasil yang ditetapkan sekaligus, tetapi kemudian memberi Anda satu baris pada satu waktu untuk berurusan dengan kode PHP Anda. Jadi itu menghindari kesalahan memori dalam PHP, tetapi pada beberapa titik itu akan memicu ukuran paket mysql max, jika hasil yang ditetapkan sangat besar. Saya pikir saya akan mencoba dan membangun resource_iterator chunked abstrak yang bagus menggunakansetPageSize()
Saya setuju dengan Ben Lessani bahwa Anda harus menggunakan
core/iterator
model sumber daya untuk memuat koleksi besar satu baris setiap kali jika memungkinkan .Namun, ada batasannya. Seperti dijelaskan dalam " addAttributeToSelect tidak bekerja dengan core / resource_iterator? " Itu tidak berfungsi dengan baik dengan model EAV jika Anda perlu memasukkan nilai dari tabel nilai atribut.
Dan contoh yang ditautkan dari StackOverflow sebenarnya tidak begitu bagus karena mengulangi permintaan yang sama dengan
LIMIT
ekspresi yang berbeda . Untuk kueri kompleks, ini mungkin masalah kinerja, tetapi yang lebih penting, Anda akan mendapatkan duplikat jika baris baru ditambahkan di antaranya.Cara yang lebih baik untuk menangani koleksi dalam potongan adalah dengan terlebih dahulu memuat semua id, kemudian gunakan id ini sebagai filter untuk koleksi halaman yang sebenarnya.
Contoh sederhana untuk produk:
sumber