0

这是一个运行以下代码的 ajax 文件:

$model = Mage::getModel('catalog/product'); //getting product model
    foreach ($violins as $k => $v)
       {
           $_product = $model->load($v); //getting product object for particular product id
           $violinmodel = $_product->getAttributeText('Violinmodel'); //grabbing the violinmodel attribute value
           echo $violinmodel;
       }

$violin 包含一个包含三个产品 ID 的数组。我的输出正在回显第二个和第三个 ID 的属性值,但没有回显第一个 ID!

我完全不明白这个!为什么它会完全跳过循环中的第一个 ID 并且不回显任何内容,而回显以下 ID 却没有问题?

属性设置正确,无论我如何重新排列 $violins 数组中的 ID,第一个属性值总是被跳过。我错过了什么?

4

2 回答 2

1

当您在 Magento 中迭代产品集合时,它包含的项目实际上是产品对象实例。考虑到您要完成的工作(获取一个属性),您在这里所做的事情(多次访问数据库,加载所有属性)是不必要的。尝试将属性添加到集合开始并对其进行迭代:

$coll = Mage::getModel('catalog/product')->getCollection()
                                           ->addAttributeToSelect('Violinmodel');
                                           //be certain that the attribute code is capitalized...

foreach ($coll as $product) {
    //var_dump($product->debug()); //for example
    var_dump($product->getAttributeText('Violinmodel));
}
于 2012-06-21T02:55:01.777 回答
1

$model在循环之外进行初始化是不安全的。你可能认为你在内存和/或函数调用方面效率更高,但你是在自找麻烦。该Mage_Catalog_Model_Product对象当时正在加载,调用->load()并没有给你一个新对象,它只是设置你现有对象的数据。除了,当不是所有的数据都被覆盖时,你会得到奇怪的行为(例如,如果 ProductA 有 Violinmodel 属性而 ProductB 没有......它看起来像 ProductA.Violinmodel == ProductB.Violinmodel)。因此,您应该始终将模型放在循环中。

foreach ($violins as $k => $v) {
    $_product = Mage::getModel('catalog/product')->load($v); //getting product
    if ($_product->getId() == $v) { // sanity check
        $violinmodel = $_product->getAttributeText('Violinmodel'); //grabbing the violinmodel attribute value
        echo $violinmodel;
    }
}

或者,正如 Benmarks 建议的那样,通过集合加载此数据:

$_products = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('Violinmodel')
    ->addIdFilter($violins);
foreach ($_products as $_product) {
    echo $_product->getAttributeText('Violinmodel'));
}
于 2012-06-21T03:58:58.097 回答