Aynı “X” kimliğine sahip öğe (Mage_Sales_Model_Order) zaten var


12

Magento'nun yönetici alanında bir gönderi oluşturduktan var/reportsonra, yönetici siparişi ızgara sayfasını görüntülerken klasörde (varsayılan Magento kilitlenme sayfasından sonra) aşağıdaki hata görünür :

Item (Mage_Sales_Model_Order) with the same id "1234" already exist

app/code/core/Mage/Eav/Model/Entity/Collection/Abstact.phpSatır 662 , varien nesne seçiciye bir DISTINCT yan tümcesi ekleyerek bu hatadan kurtulabilirsiniz. Ancak, gerçekten birkaç nedenden dolayı (ölümcül yavaş sorgular, çekirdek dosyaları düzenleme, vb) yapmak istemiyorum.

Veri bütünlüğünü korurken bunu çözmenin en iyi yolu nedir? Siparişi silmeli miyim? Yapıcı girdileri takdir ediyorum, özellikle bu çatışmaya ilk başta neyin sebep olacağı konusunda. Teşekkürler.

-- Düzenle --

İşte netlik / aptallığımı belirtmek için tam yığın izlemesi:

a:5:{i:0;s:67:"Item (Mage_Sales_Model_Order) with the same id "1234" already exist";i:1;s:4829:"#0 lib/Varien/Data/Collection/Db.php(576): Varien_Data_Collection->addItem(Object(Mage_Sales_Model_Order))
#1 app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(533): Varien_Data_Collection_Db->load()
#2 app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php(61): Mage_Adminhtml_Block_Widget_Grid->_prepareCollection()
#3 app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(626): Mage_Adminhtml_Block_Sales_Order_Grid->_prepareCollection()
#4 app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(632): Mage_Adminhtml_Block_Widget_Grid->_prepareGrid()
#5 app/code/core/Mage/Core/Block/Abstract.php(862): Mage_Adminhtml_Block_Widget_Grid->_beforeToHtml()
#6 app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml()
#7 app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('grid', true)
#8 app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php(77): Mage_Core_Block_Abstract->getChildHtml('grid')
#9 app/design/adminhtml/default/default/template/widget/grid/container.phtml(36): Mage_Adminhtml_Block_Widget_Grid_Container->getGridHtml()
#10 app/code/core/Mage/Core/Block/Template.php(241): include('/var/www/html/m...')
#11 app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
#12 app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#13 app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
#14 app/code/core/Mage/Adminhtml/Block/Widget/Container.php(308): Mage_Adminhtml_Block_Template->_toHtml()
#15 app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Widget_Container->_toHtml()
#16 app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml()
#17 app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Text_List->_toHtml()
#18 app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml()
#19 app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('content', true)
#20 app/design/adminhtml/default/default/template/page.phtml(74): Mage_Core_Block_Abstract->getChildHtml('content')
#21 app/code/core/Mage/Core/Block/Template.php(241): include('/var/www/html/m...')
#22 app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
#23 app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#24 app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
#25 app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Template->_toHtml()
#26 app/code/core/Mage/Core/Model/Layout.php(555): Mage_Core_Block_Abstract->toHtml()
#27 app/code/core/Mage/Core/Controller/Varien/Action.php(390): Mage_Core_Model_Layout->getOutput()
#28 app/code/core/Mage/Adminhtml/controllers/Sales/OrderController.php(95): Mage_Core_Controller_Varien_Action->renderLayout()
#29 app/code/core/Mage/Core/Controller/Varien/Action.php(419): Mage_Adminhtml_Sales_OrderController->indexAction()
#30 app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('index')
#31 app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#32 app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#33 app/Mage.php(683): Mage_Core_Model_App->run(Array)
#34 index.php(71): Mage::run('base', 'website')
#35 {main}";s:3:"url";s:72:"/index.php/admin/sales_order/index/key/0b7375aca52608483edc0cf879bd4361/";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:5:"admin";}

8
FWIW Bu aptal hatadan nefret ediyorum ve hata ayıklamayı kabul ettiğimden daha fazla zaman geçirdim.
philwinkle

Koleksiyon sorgunuzu veya php kodunuzu ekleyebilir misiniz?
Sukeshini

Yanıtlar:


10

Koleksiyona, sorgu sonucuna kopyalar ekleyen bir şey eklediniz.

Magento'nun sorgu sonucuyla yaptığı şey, her satırdan nesne oluşturmak ve daha sonra bu öğeleri koleksiyona eklemek. Öğe zaten varsa, bu hata atılır.

Çözüm: Eklediğiniz her ne olursa olsun, sonucunuzun farklı olup olmadığını kontrol edin.

Şu alanların yanına daha fazla alan eklediyseniz sales_flat_order, bu alanlar farklı olabilir ve bu nedenle DISTINCT.


6

Henüz yorum ekleyemediğim için bir yanıt ekliyorum. @Fabian ile aynı fikirdeyim - ancak kullanımını engellemiyorum DISTINCTve GROUP BYgenellikle doğru bir şekilde plan yaparsanız birleştirmenizi tek bir sonuca göre filtreleyebilirsiniz.

Örneğin (bunun önemsiz bir örnek olduğunu biliyorum):

Kullanarak bir sipariş toplayacak sales/flat_orderve müşterilerin adreslerine katılmışsanız, fatura adresi ve teslimat adresi depolanmış iki kayıt vardır . Bu sorunu çözmek için hangi tip adrese katılmak istediklerini belirtebilirsiniz.

Bu durum sizin durumunuza benzer, ancak bu senaryo dışında.


3

Sistemimizde de bazı sorunlarla karşılaştık. Sorunu analiz ettik ve buldum Grid.php(örnek: /namespace/modulename/Block/Adminhtml/Sales/Order/Grid.php)

Dosyada _prepareCollection()fonksiyon bulduk Grid.php.

Hata kodlaması:

//Error coding
$collection->join(array('payment' => 'sales/order_payment'), 'main_table.entity_id = parent_id', 'method')
            ->getSelect()
            ->where("`payment`.`method` like '%paypal%'");

Çözüm:

//Solution coding
$collection->join(array('payment' => 'sales/order_payment'), 'main_table.entity_id = parent_id', 'method')
            ->getSelect()
            ->where("`payment`.`method` like '%paypal%'")
            ->group('method');

Biz kullanımı vardır ->group('value')filtre işlevi. Şimdi iyi çalışıyor ... !!!


3

Bunun eski bir soru olduğunu biliyorum ve zaten cevaplandı ama cevabımı eklemek istiyorum çünkü diğer benzer sorunlarla karşılaşmaya yardımcı olabileceğini hissediyorum. Bu tür bir hatanın genel nedenlerini açıklamaya çalışıyorum.

Başlangıç ​​olarak, Mage_Sales_Model_Orderstandart bir Magento kurulumunda asla böyle bir hata vermemelisiniz. Bu yüzden bu hatanın üçüncü taraf bir uzantıdan (gözlemci, kanca yöntemi, yeniden yazma vb.) Veya ilk etapta verileri bozan yanlış bir kod özelleştirmesinden kaynaklandığından şüpheleniyorum. "Tuhaf" davranan çekirdek bileşenler hakkında konuşurken, distinctveri ilk etapta asla bozulmamış olmalıydı çünkü çözüm bile mevcut olmamalıdır! Önce kodu değiştirmek yerine verilerin kendisini düzeltin.

Özel bir EAV varlık türü oluşturduğumda benzer bir sorunla karşılaştım ve varlıklardan birini düzenleyene kadar her şey iyi çalıştı. Her nasılsa, düzenleme, varlığın metin özelliklerinden biri için yinelenen değerle sonuçlandı, yani, aynı varlığın aynı özelliği için metin değeri tablosundaki iki satır. Ham sorgulama sadece custom_entity tablo hiçbir yinelenen ile mükemmel görünüyordu (nasıl olabilir? Birincil anahtar kısıtlaması zaten bütünlüğü sağladı) böylece sorun başka bir yerde oldu.

Koleksiyonu yüklerken önceden tahmin etmiş olabileceğiniz gibi, satırları veritabanından almak için kullanılan birleşimler nedeniyle ve bir varlığın aynı özniteliği için iki aynı metin değeri olduğu düşünüldüğünde, aynı entity_iddeğere sahip ancak farklı iki satır aldı value_id.

Genel bir kural olarak, böyle bir hata ortaya çıktığında, veritabanındaki verilerin zaten bozuk olduğundan veya son sorguyu gerçekleştiren birleştirmelerin veritabanından neredeyse tam iki satır alacağından ve koleksiyonun benzersiz tanımlayıcısını çoğaltacağından şüphelenmelisiniz. öğeler.

Bu yardımcı olur umarım.

Not: Benim durumumda yinelenen eav metin değerinin neden olduğu konusunda Marius'un yorumunu buradan kontrol edin http://inchoo.net/magento/creating-an-eav-based-models-in-magento/


0

Bu benim kod aynı sorunu var sonra iyi çalışıyor:

    $collection = Mage::getResourceModel('sales/order_grid_collection');
    $prefix = Mage::getConfig()->getTablePrefix();  

    $collection->getSelect()->joinleft(array('order'=> $prefix.'sales_flat_order'),'order.entity_id=main_table.entity_id',array('pdeliverydate'));   

    $collection->getSelect()->joinleft(array('address'=> $prefix.'sales_flat_order_address'),'address.parent_id=main_table.entity_id',array('telephone'))->group('entity_id');

    $this->setCollection($collection);
    return parent::_prepareCollection();

Sorunu çözmek için add -> group ('entity_id') var.


Zaten 1 yıl önce önerildi ( magento.stackexchange.com/a/139898/46249 ) ... -1.
sv3n

-1

Mage_Sales_Model_Resource_Order_Grid_Collection::addItembu istisnayı atmak için geçersiz kılmaya çalışmalısınız:

<?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();
    }
...

1
Bu bir çözüm değil, sadece hata mesajından kurtulmanın bir yoludur.
Niels

1
Ezme hataları bunları düzeltmekle aynı şey değildir, toplama sonucunuza farklı eklemeyi düşünün veya birleştirme sorgusunu bir alana göre gruplandırın.
DWils
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.