这是一个运行以下代码的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,都会跳过第一个属性值。我错过了什么?
答案 0 :(得分: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));
}
答案 1 :(得分: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;
}
}
或者,如建议的那样,通过集合加载此数据:
$_products = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('Violinmodel')
->addIdFilter($violins);
foreach ($_products as $_product) {
echo $_product->getAttributeText('Violinmodel'));
}