ฉันจะแก้ไข“ รายการ (Mage_Catalog_Model_Product) ด้วยรหัสเดียวกัน” xxx“ มีอยู่แล้ว” ได้อย่างไร


18

ฉันได้รับข้อผิดพลาดนี้เมื่อพยายามกรองชุดผลิตภัณฑ์

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist และต้องการถามสิ่งที่อาจทำให้เกิดข้อผิดพลาดเนื่องจากมีผลิตภัณฑ์ (มองเห็นได้) เพียงผลิตภัณฑ์เดียวที่มี ID เดียวกันภายใน Magento

มีตารางที่ต้องล้างค่าเพื่อลบรายการที่ซ้ำกันนี้หรือไม่?


คุณสามารถเพิ่มรหัสได้ไหม คุณต้องใช้group byเพื่อรับรหัสผลิตภัณฑ์ที่ไม่ซ้ำกันเท่านั้น ดูmagento.stackexchange.com/questions/12773/…
Renon Stewart

@RS, สวัสดีฉันยังคงพยายามหาสาเหตุที่ฉันจะโพสต์กลับมาทันทีที่ฉันติดตามมัน ...
user1704524

คำตอบ:


36

การเพิ่มdistinctตามที่แนะนำในคำตอบที่ยอมรับจะช่วยแก้ไขปัญหา แต่ก็มีปัญหาด้านประสิทธิภาพ ฐานข้อมูลอาจสร้างตารางชั่วคราวบนดิสก์เมื่อดำเนินการค้นหาด้วยdistinctซึ่งจะทำให้คำขอของคุณช้าลง คุณสามารถเพิ่มgroupเงื่อนไขลงในคอลเลกชันเพื่อลบรายการที่ซ้ำกัน

ลองดูที่โพสต์นี้ สิ่งที่พวกเขาทำ (และฉันได้ทำมันด้วย) คือกลุ่มตามรหัสเอนทิตี สิ่งนี้จะทำงานได้ดีขึ้น

//adding filters to the collection..

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

คุณช่วยบอกได้ไหมว่าเราต้องเพิ่มรหัสนี้จากที่ไหน
Baby in Magento

@BabyinMagento ไม่ว่าคุณจะใช้งานคอลเล็กชันอะไรในรหัสที่กำหนดเอง ข้อผิดพลาดนี้เกิดขึ้นเมื่อสร้างโมดูลที่กำหนดเองที่ดึงคอลเลกชันจากฐานข้อมูล ซึ่งหมายความว่าอาจปรากฏขึ้นหากคุณติดตั้งโมดูลบุคคลที่สามเมื่อเร็ว ๆ นี้ ในกรณีนั้นขึ้นอยู่กับผู้พัฒนาโมดูลดังกล่าวเพื่อค้นหาตำแหน่งของข้อผิดพลาด
Vic

distinct()วิธีการแก้ปัญหาและการนี้จะลบระเบียนใด ๆ เพิ่มเติมจากแบบสอบถามซึ่งหมายความว่าคุณอาจสูญเสียข้อมูลโดยไม่สังเกตเห็น ดังนั้นนี่อาจไม่ใช่ทางออกที่ดีที่สุดอย่างในกรณีของฉัน ตอนนี้ฉันกำลังพยายามหาวิธีที่จะได้รับทั้งบันทึกจากตารางที่ฉันเข้าร่วมในการรวบรวมเพื่อที่ฉันจะได้สามารถแสดงทั้งสองระเบียนในแถวเดียวกันในตาราง
Jacques

ข้อควรทราบเล็กน้อย: สิ่งสำคัญคือสิ่งนี้จะไม่เชื่อมโยงสิ่งนี้เข้ากับคอลเลกชัน แต่ Furst นำ colelction ของคุณไปใช้กับตัวแปรและไม่ใช่ $ collection-> getSelect () -> กลุ่ม ('e.entity_id');
Rickert

ฉันจะอัปเดตรหัสนี้ได้ที่ไหน
zus

7

โดยปกตินี่เป็นข้อบกพร่องในข้อมูลหรือในการใช้งานคอลเลกชัน

นี่คือวิธีแก้ไขปัญหาที่กว้างขึ้น นี้ทำงานบนคอลเลกชันโดยพลการไม่เพียง Catalog_Model_Productแต่สำหรับ

ขั้นตอนที่ 1. การปรับเปลี่ยนไฟล์หลักlib/Varien/Data/Collection.php, function addItem()แต่ไม่เหมือนคำตอบนี้แสดงให้เห็นไม่ซ่อนข้อผิดพลาด

ให้เพิ่มข้อมูลข้อผิดพลาดพิเศษลงในข้อยกเว้นที่เกิดขึ้นแทน:

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

ขั้นตอนที่ 2 ใช้แบบสอบถามที่ละเมิดจากรายงานข้อผิดพลาดของคุณและเรียกใช้ด้วยมือ ดูว่าระเบียนใดที่ทำสำเนาคีย์การรวบรวม เพิ่มorder by <key field>ตามต้องการ

แยกแบบสอบถามออกตารางที่เข้าร่วมแบบหนึ่งต่อหนึ่งและดูว่าระเบียนใดทำให้เกิดการทำซ้ำ

ฉันเชื่อว่าแพทช์นี้ควรอยู่ในแกนกลาง


3

ปัญหาของคุณคือคุณมีคอลเลกชัน (น่าจะเป็นกับการเข้าร่วมหรือสหภาพ) ที่ทำให้ผลิตภัณฑ์เดียวกันโหลดลงในคอลเลกชันสองครั้ง

คุณสามารถเปลี่ยนแปลงคอลเลกชันที่ถูกโหลดได้โดยการเพิ่มวิธีการที่แตกต่างกันไปยังวัตถุที่เลือก

ดูhttp://framework.zend.com/manual/1.12/en/zend.db.select.html

$db->select()
         ->distinct()

แต่สิ่งนี้มาพร้อมกับปัญหาโดยธรรมชาติ การใช้ความแตกต่างจะทำให้ตารางชั่วคราวถูกสร้างขึ้นบนดิสก์ไม่ใช่ในหน่วยความจำซึ่งมาพร้อมกับบทลงโทษด้านประสิทธิภาพ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.