我一直在努力将两个不同的系列合并在一起,我觉得很难做到。
实际上,我唯一要做的就是在已经实例化的(我认为)集合中添加另一个属性。
这是我的代码:
private function _addProductsToBanners()
{
$skus = $this->_getBannersSkus();
$products = Mage::getResourceModel('catalog/product_collection')
->addFieldToFilter('sku', array('in' => $skus))
->addAttributeToSelect(array('name'));
/** @var Developer_Banners_Model_Resource_Banner_Collection $banners */
$banners = $this->banners;
foreach ($banners as $banner) {
foreach ($products as $product) {
if ($banner->getSku() == $product->getSku())
{
$banner->setData('product', 1);
}
}
}
echo '<pre>';
print_r($banners->getData());
echo '</pre>';
}
问题在于,使用$banners
打印getData()
集合时,我看不到[product]
属性,但如果我在没有getData()
的情况下执行此操作,那么我看到它。
如果您有任何想法我会非常感激!
谢谢!
答案 0 :(得分:2)
当Developer_Banners_Model_Resource_Banner_Collection
从Mage_Core_Model_Resource_Db_Collection_Abstract
继承并添加项目时,该项目不会添加到$ _data属性,而是添加到$ _items属性。
protected function _addItem($item)
{
$this->_items[] = $item;
return $this;
}
当您调用getData()
方法时,$ _data属性仍为null。然后getData()方法将从数据库中获取数据并返回结果。
public function getData()
{
if ($this->_data === null) {
$this->_renderFilters()
->_renderOrders()
->_renderLimit();
/**
* Prepare select for execute
* @var string $query
*/
$query = $this->_prepareSelect($this->getSelect());
$this->_data = $this->_fetchAll($query, $this->_bindParams);
$this->_afterLoadData();
}
return $this->_data;
}
通过迭代对象,执行each()
方法:
public function each($obj_method, $args=array())
{
foreach ($args->_items as $k => $item) {
$args->_items[$k] = call_user_func($obj_method, $item);
}
}
此方法使用$_items
属性作为数据源。
不幸的是,我现在无法解释这种行为。
答案 1 :(得分:0)
我发现的是,在你实际调用_data
之前,集合getData()
属性没有被设置,但每个集合成员上的_data
实际上已经设置,所以它是可能的在迭代集合时访问新添加的属性。