Saat ini saya menggunakan kembali banyak koleksi yang bersarang dalam loop foreach. Apakah mungkin untuk memindahkan beberapa tingkat ini ke atas? Saat ini saya terpaksa memuat ulang koleksi yang memiliki entitas 51k + berulang-ulang yang sangat memperlambat segalanya. Khususnya koleksi koleksi kit.
<?php
class Codespace_Module_Helper_Item extends other_one{
function functionOne($collection){
...
$data = $collection->getData();
foreach($data as $item){
$this->_functionTwo($item);
}
...
}
function _functionTwo($item){
$model = Mage::getModel('catalog/product');
$id = $model->getIdBySku($item['sku']);
$inventoryStatus = Mage::getResourceSingleton('catalog/product')->getAttributeRawValue($id, 'product_inventory_status', 1);
$invStatus = $model->getResource()->getAttribute('product_inventory_status')->getSource()->getOptionText($inventoryStatus);
if ($invStatus && $id) {
if ($invStatus !== 'Z') {
$stockItem = Mage::getModel('cataloginventory/stock_item');
$stockItem->setData(array());
$stockItem->loadByProduct($id);
if ($stockItem->getQty() != $item['quantity']) {
$stockItem->setQty(item['quantity']);
$stockItem->save();
$this->functionThree($item['sku']);
}
}
}
}
function functionThree($sku){
$collectionOfKits = Mage::getModel('kitinventory/kitinventory')->getCollection()->addFieldToFilter('related_sku',$sku);
if($collectionOfKits->getSize()){
foreach($collectionOfKits as $kit){
$kitSku = $kit->getSku();
$kitCollection = Mage::getModel('kitinventory/kitinventory')->getCollection()->addFieldToFilter('kit_sku',$kitSku)->setOrder('related_sku','ASC');
...
foreach($kitCollection as $component){
$componentSkus[] = $component->getRelatedSku();
$componentRequiredQuantity[] = $component->getRequiredQuantity();
}
$componentProductCollection = Mage::getModel('catalog/product')->getCollection();
$componentProductCollection->joinField('qty',
'cataloginventory/stock_item',
'qty',
'product_id=entity_id',
'{{table}}.stock_id=1',
'left');
$componentProductCollection->addAttributeToFilter('sku', array('in' => $componentSkus));
foreach($componentProductCollection as $component){
$quantity = $component->getQty();
...
}
$kitId= Mage::getModel('catalog/product')->getIdBySku($kitSku)
$kitStockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($kitId);
$this->functionFour($kitStockItem,$kitSku,$amountOfKitsPossible);
}
}
}
function functionFour($kitStockItem,$kitSku,$amountOfKitsPossible){
...
$kitStockItem->setQty($quantity);
$kitStockItem->save();
...
}
EDIT: ini adalah fungsi saat ini yang saya buat, saya masih berpikir ada cara yang lebih baik untuk menangani koleksi ini.
collection
model
object
easymoden00b
sumber
sumber
functionOne($collection)
? Dalam urutan apa ukuran / jumlah barang itu? Apakah perlu untuk mengulanginya untuk mendapatkan SKU?Jawaban:
Ada beberapa hal yang bisa Anda kerjakan;
&
dalam deklarasi parameter fungsi sepertifunction hello(array &$world)
if
pernyataan yang lebih cerdas untuk mengurangi indentasi->cleanModelCache()->clearInstance()
dariMage_Core_Model_Model_Abstract
menghapus data yang mendasari untuk beberapa objek, dapat mempercepat hal-hal.Menambahkan versi terbaru dari kode Anda dengan beberapa rekomendasi sebaris pada kode Anda saat ini, saya bisa melanjutkan sedikit, tetapi saat ini tidak akan menambahkan lebih banyak untuk itu.
Fungsi 1: Tujuan berjalan koleksi
Fungsi 2: Tujuan memperbarui stok jika diubah
Fungsi 3: Tujuan memperbarui item stok terkait
Fungsi 4: Harus membuat tebakan keberuntungan (atau sial), karena sekarang ini merupakan fungsi yang tidak berguna, dapat ditambahkan seperti pada Fungsi 3.
sumber
Saya ingin menambahkan ini sebagai komentar tetapi saya belum memiliki perwakilan yang cukup. Lihatlah bagaimana grid inti Magento bergabung dengan jumlah produk ke katalog / koleksi produk di sini: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/core/Mage/Adminhtml /Block/Catalog/Product/Grid.php#L65
Jika Anda bergabung dengan tabel untuk mendapatkan qty, Anda tidak harus menyebutnya dalam satu lingkaran:
Mage::getModel('cataloginventory/stock_item')->loadByProduct($product)->getQty();
Alternatif lain adalah untuk melihat apakah Anda dapat men-cache hasil dari proses intensif sistem ini. Mungkin Anda bisa membuat tabel database kedua untuk menyimpan hasilnya, dan menyegarkannya seperti indeks magento.
sumber
Anda tidak perlu memuat ulang model berulang-ulang,
Mage::getModel()
dengan referensi sudah cukup tanpa mengetahui bagaimana model sumber daya Anda diatur, sulit untuk mengatakan apakah itu diinisialisasi ulang setiap kali dalam memori dan dalam loop itu Anda akhirnya bocor / kehabisan memori menyebabkan disk swap terjadi mungkin.Satu koleksi untuk mengatur semuanya. Refactoring fungsi hanya untuk referensi satu koleksi. Ini sama dengan SQL standar dan pemrograman prosedural. Luangkan waktu lebih sedikit untuk menyelidiki koleksi dan model sumber daya Anda tentang bagaimana Anda bisa mendapatkan semua data yang Anda butuhkan dari SQL satu kali, mungkin dua kali dan kemudian memiliki memori yang cukup di tempat serta referensi data untuk perulangan untuk tampilan / manipulasi. Juga lebih mudah untuk menyimpan satu hasil dalam cache vs banyak, ini adalah kasus yang sama untuk mekanisme cache bawaan MySQL juga, karena permintaan yang sering cukup besar akan menyebabkan masalah disk swap yang sama.
Simpan I / O
Vinai memiliki contoh yang baik untuk menerapkan pendekatan yang sama:
Referensi :
sumber