【问题标题】:Magento Reports - Products - Products Ordered issue: Item (Mage_Catalog_Model_Product) with the same id already existMagento 报告 - 产品 - 订购的产品问题:具有相同 ID 的项目 (Mage_Catalog_Model_Product) 已存在
【发布时间】:2011-12-25 07:59:57
【问题描述】:

问题: 在 Magento 管理面板中,通过 Reports - Products - Products Ordered 生成报告时,发生错误:

已存在具有相同 ID“45”的项目 (Mage_Catalog_Model_Product) #0 /home/glassesm/public_html/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(236): Varien_Data_Collection->addItem(Object(Mage_Catalog_Model_Product)) #1 /home/glassesm/public_html/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(964): Mage_Eav_Model_Entity_Collection_Abstract->addItem(Object(Mage_Catalog_Model_Product)) #2 /home/glassesm/public_html/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(794): Mage_Eav_Model_Entity_Collection_Abstract->_loadEntities(false, false) #3 /home/glassesm/public_html/lib/Varien/Data/Collection.php(729): Mage_Eav_Model_Entity_Collection_Abstract->load() #4 /home/glassesm/public_html/app/code/core/Mage/Reports/Model/Totals.php(53): Varien_Data_Collection->getIterator() #5 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Report/Grid.php(368):Mage_Reports_Model_Totals->countTotals(Object(Mage_Adminhtml_Block_Report_Product_Sold_Grid),'2011-12-10 00:0。 ..', '2011-12-10 23:5...') #6 /home/glassesm/public_html/app/design/adminhtml/default/default/template/report/grid.phtml(138): Mage_Adminhtml_Block_Report_Grid->getReport('2011-12-10 00:0...', ' 2011-12-10 23:5...') #7 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(216): include('/home/glassesm/...') #8 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(247): Mage_Core_Block_Template->fetchView('adminhtml/defau...') #9 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(261): Mage_Core_Block_Template->renderView() #10 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() #11 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(758): Mage_Adminhtml_Block_Template->_toHtml() #12 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(525): Mage_Core_Block_Abstract->toHtml() #13 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(476): Mage_Core_Block_Abstract->_getChildHtml('grid', true) #14 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php(70): Mage_Core_Block_Abstract->getChildHtml('grid') #15 /home/glassesm/public_html/app/design/adminhtml/default/default/template/widget/grid/container.phtml(36): Mage_Adminhtml_Block_Widget_Grid_Container->getGridHtml() #16 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(216): include('/home/glassesm/...') #17 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(247): Mage_Core_Block_Template->fetchView('adminhtml/defau...') #18 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(261): Mage_Core_Block_Template->renderView() #19 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() #20 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Widget/Container.php(295): Mage_Adminhtml_Block_Template->_toHtml() #21 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(758): Mage_Adminhtml_Block_Widget_Container->_toHtml() #22 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml() #23 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(758): Mage_Core_Block_Text_List->_toHtml() #24 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(525): Mage_Core_Block_Abstract->toHtml() #25 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(476): Mage_Core_Block_Abstract->_getChildHtml('content', true) #26 /home/glassesm/public_html/app/design/adminhtml/default/default/template/page.phtml(74): Mage_Core_Block_Abstract->getChildHtml('content') #27 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(216): include('/home/glassesm/...') #28 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(247): Mage_Core_Block_Template->fetchView('adminhtml/defau...') #29 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Template.php(261): Mage_Core_Block_Template->renderView() #30 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml() #31 /home/glassesm/public_html/app/code/core/Mage/Core/Block/Abstract.php(758): Mage_Adminhtml_Block_Template->_toHtml() #32 /home/glassesm/public_html/app/code/core/Mage/Core/Model/Layout.php(529): Mage_Core_Block_Abstract->toHtml() #33 /home/glassesm/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(389): Mage_Core_Model_Layout->getOutput() #34 /home/glassesm/public_html/app/code/core/Mage/Adminhtml/controllers/Report/ProductController.php(97): Mage_Core_Controller_Varien_Action->renderLayout() #35 /home/glassesm/public_html/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Adminhtml_Report_ProductController->soldAction() #36 /home/glassesm/public_html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(253): Mage_Core_Controller_Varien_Action->dispatch('sold') #37 /home/glassesm/public_html/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http)) #38 /home/glassesm/public_html/app/code/core/Mage/Core/Model/App.php(340): Mage_Core_Controller_Varien_Front->dispatch() #39 /home/glassesm/public_html/app/Mage.php(627): Mage_Core_Model_App->run(Array) #40 /home/glassesm/public_html/index.php(80): Mage::run('', 'store') #41 {主要}

你能帮我解决这个问题吗?

【问题讨论】:

  • 为我解决了这个问题$collection->distinct(true);
  • 你在哪里添加了这段代码?
  • @DamodarBashyal 你在哪里写的这段代码?
  • @Nafisa 抱歉,时间太长记不住了。

标签: magento report


【解决方案1】:

实际上,我在 2 台不同的服务器上有 2 家不同的商店,并且都使用 magento 1.6。我在两家商店都有这个问题。 检查数据库,那里没有重复条目。

我的解决方案是:

编辑:/www/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php
线路:256

替换:return parent::addItem($object);

与:try { return parent::addItem($object); } catch (Exception $ex) { }

它工作完美,但欢迎任何其他解决方案。

【讨论】:

  • 也在这里工作过!添加了修复。删除了有问题的帖子,并希望数据库会好起来。删除了核心黑客。
  • 这并不能解决问题,只是隐藏它。相当糟糕的“解决方案”。此外,它是一个核心黑客 -.-
【解决方案2】:

这是因为您的产品集合返回重复的产品 ID,您可以通过分组“e.entity_id”对产品集合进行分组

试试这个

$collection = Mage::getModel('catalog/product')
->getCollection()
->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
->addAttributeToSelect('*')
->addAttributeToFilter('category_id', array('in' => $uniqueIds));

<?php $collection->getSelect()->group('e.entity_id');?>

【讨论】:

  • 好答案,我在扩展时遇到了这个问题,但我只需要搜索' Mage::dispatchEvent( ... ' 部分并在该调用之前添加代码的最后一行。
【解决方案3】:

这表示您有两个具有相同 ID 的产品。这可能发生在您使用进口产品或大规模更新产品时。

简单的解决方案是找到 ID 为 35 的产品,然后将其删除,因为它是重复的,或者更改 ID,因为它必须是唯一的。请注意,您应该查看所有相关表,而不仅仅是产品表。问题可能出在您的 EAV 属性表或其他任何数量的表上。

【讨论】:

  • SELECT * FROM catalog_product_entity group by entity_id count(entity_id) > 1 返回空结果 - 此表中没有重复的实体。
  • 您还需要检查所有相关表格。更有可能是属性问题。您能否进一步说明导致此问题的原因?
  • 对我来说删除和重新创建有问题的产品有效
【解决方案4】:

在同一个地方遇到同样的错误,这就是我修复的原因和方法。

Magento 订购产品报告从“sales_flat_order_item”构建“列表”,然后加入“catalog/product”以获取有关产品的更多信息(sku、类型、选项、attribute_set 等)。

在我的情况下,3 个产品从商店中删除,当 Magento 构建列表并加入目录/产品时,我上面列出的所有信息都是 NULL。 Report 模块在构建集合时,在方法 addItem 中尝试设置一个 ID 作为集合数组中的 key,在那些被删除的产品中没有 ID,因此设置为 NULL。

想象这组项目来构建报告。

ID - 名称:1、2、3,已删除项目,4

当“DELETE ITEM”添加到集合中时,将如下所示:

Array(
    1 => Object,
    2 => Object,
    3 => Object,
    4 => Object (DELETED ITEM)
)

这是因为在 addItem 中,当没有 ID 时,Magento 会自动在数组中添加一个新位置:

if (!is_null($itemId)) {
    .
    .
    .
} else {
    $this->_items[] = $item;
}

然后,当集合添加下一项(ID:4)时,将抛出您正在查看的异常:

if (isset($this->_items[$itemId])) {
    throw new Exception('Item ('.get_class($item).') with the same id "'.$item->getId().'" already exist');
}

改变 addItem 的工作方式是非常危险的!!集合在 Magento 中无处不在,添加 trycatch 块肯定会影响您的商店在其他地方/模块中的工作方式。这是我修复的方法:

您可以复制到本地或使用自定义模块覆盖,这取决于您:

在“Reports_Product/Collection”中添加新方法以仅过滤“现有产品”

app/code/local/Mage/Reports/Model/Mysql4/Product/Collection.php

public function addNotDeletedProductRestrition(){
    $this->getSelect()->where('order_items.product_id is NOT NULL');

    return $this;
}

在 ORDERED 集合中调用此方法。

app/code/local/Mage/Reports/Model/Mysql4/Product/Ordered/Collection.php

protected function _joinFields($from = '', $to = '')
{
    $this->addAttributeToSelect('*')
        ->addOrderedQty($from, $to)
        ->setOrder('ordered_qty', 'desc')
        ->addNotDeletedProductRestrition();

    return $this;
}

我已经放在 _joinFields 里面了,但是你可以在任何你想调用的地方调用。

对不起,我生疏的英语,我没有太多时间来复习,这个错误已经花了我很多时间。

【讨论】:

    【解决方案5】:

    您还可以覆盖您的集合 calss Mage_Sales_Model_Resource_Order_Grid_Collection::addItem,这会引发此异常:

    <?php
    class Fixed_Order_Grid_Collection extends Mage_Sales_Model_Resource_Order_Grid_Collection{
    
        public function addItem(Varien_Object $item)
        {
            $itemId = $this->_getItemId($item);
    
            if (!is_null($itemId)) {
                if (isset($this->_items[$itemId])) {
                    //throw new Exception('Item ('.get_class($item).') with the same id "'.$item->getId().'" already exist');
                }
                $this->_items[$itemId] = $item;
            } else {
                $this->_addItem($item);
            }
            return $this;
        }
    }
    class MyCompony_MyExtention_Block_Adminhtml_OrderGrid extends Mage_Adminhtml_Block_Widget_Grid
    {
         public function __construct()
        {
            parent::__construct();
            $this->setId('sales_order_grid');
            $this->setUseAjax(true);
            $this->setDefaultSort('created_at');
            $this->setDefaultDir('DESC');
            $this->setSaveParametersInSession(true);
        }
        protected function _getCollectionClass()
        {
            return 'sales/order_grid_collection';
        }
    
        protected function _prepareCollection()
        {
            $collection = new Fixed_Order_Grid_Collection();
            $select = $collection->getSelect();
            $select->join('sales_flat_order_item AS order_item', 'order_item.order_id=main_table.entity_id','quote_item_id',NULL);
            $select->distinct();
            $this->setCollection($collection);
            return parent::_prepareCollection();
        }
    ...
    

    【讨论】:

    • 这只是隐藏了问题但没有解决问题,非常糟糕的做法!
    • 有时您无法以正确的方式解决问题,有时您不能为了简单起见而这样做......
    • Sajjad 那是错误的,因为异常的存在是有原因的,像这样将其注释掉只会导致未来出现更多问题。
    【解决方案6】:

    只需转到您的管理面板,打开产品(第一行显示 ID)并保存。在所有商店视图中执行此操作。现在问题应该消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多