製品オブジェクト自体をロードせずにカスタム製品属性を使用する
-
16-10-2019 - |
質問
データベース内のほぼすべての製品のカスタム製品属性を操作する必要があります。今私はこれを持っています:
$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);
これにより、スピードが向上するはずです。
所属していません magento.stackexchange