質問

データベース内のほぼすべての製品のカスタム製品属性を操作する必要があります。今私はこれを持っています:

$productsCollection = Mage::getModel('catalog/product')->getCollection();

        foreach ($productsCollection as $_product) {
            $product = Mage::getModel('catalog/product')->load($_product->getEntityId());
            if ($product->getCustomizableonly() === null) {
                $product->setData('customizableonly', 0)->getResource()->saveAttribute($product, 'customizableonly');
            }
        }

しかし、製品は2000以上であるため、製品オブジェクト自体をロードしたくありませんが、コレクションの製品オブジェクトインスタンスだけで動作します。問題は、このOBJです。インスタンスには、製品オブジェクト自体のデータ全体の1/9のみが含まれています。そしてその 'customizableonly' 属性はその1/9の一部ではありません。

不要なオブジェクトの読み込みを行わずに属性にアクセスするにはどうすればよいですか。または一般的に - このコードを最大に最適化するにはどうすればよいか、2000以上の製品の場合には劇的に遅くはありませんか?

役に立ちましたか?

解決

このようなコレクションを入手してください。

$productsCollection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('customizableonly');

そして、ここにすべての製品を一度に更新する他の方法がありますので、電話する必要はありません saveAttribute 2k回。
私が理解していることから、あなたはの価値を設定したい customizableonly その価値を持たないすべての製品に対して0に。
ここにあります:

$toUpdate = array();
foreach ($productsCollection as $_product) {
    if (is_null($_product->getCustomizableonly())) {
        //remember the id for update
        $toUpdate[] = $_product->getId();
    }
}

//update all products
Mage::getSingleton('catalog/product_action')->updateAttributes($toUpdate, array('customizableonly'=>0), 0);  

これにより、スピードが向上するはずです。

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top