Làm cách nào tôi có thể sửa Mục Item (Mage_Catalog_Model_Sản phẩm) với cùng id id xxx xxx đã tồn tại?


18

Tôi đã gặp lỗi này khi cố gắng lọc bộ sưu tập sản phẩm

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist và muốn hỏi điều gì có thể gây ra lỗi vì chỉ có một sản phẩm (hiển thị) có cùng ID bên trong Magento.

Có một bảng cần phải được xóa để loại bỏ dupilcate này?


Bạn có thể thêm một số mã? Bạn cần sử dụng group byđể chỉ nhận id sản phẩm duy nhất. Xem magento.stackexchange.com/questions/12773/ từ
Renon Stewart

@RS, Xin chào, tôi vẫn đang cố gắng tìm ra nguyên nhân tôi sẽ đăng lại ngay sau khi tôi theo dõi nó ...
user1704524

Câu trả lời:


36

Thêm distinctnhư được đề xuất trong câu trả lời được chấp nhận sẽ khắc phục vấn đề nhưng nó có vấn đề về hiệu suất. Cơ sở dữ liệu có thể tạo các bảng tạm thời trên đĩa khi thực hiện truy vấn distinctvà điều này sẽ làm chậm yêu cầu của bạn. Thay vào đó, bạn có thể thêm một groupđiều kiện vào bộ sưu tập để loại bỏ trùng lặp.

Hãy xem bài viết này . Những gì họ đã làm (và tôi cũng đã làm nó) được nhóm theo id thực thể. Điều này sẽ thực hiện tốt hơn.

//adding filters to the collection..

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

bạn có thể vui lòng cho biết nơi chúng tôi cần thêm mã này không
Baby in Magento

@BabyinMagento bất cứ nơi nào bạn đang sử dụng bộ sưu tập của mình trong mã tùy chỉnh. Lỗi này xảy ra khi tạo các mô-đun tùy chỉnh tìm nạp các bộ sưu tập từ cơ sở dữ liệu. Điều này có nghĩa là nó có thể hiển thị nếu bạn đã cài đặt các mô-đun của bên thứ ba gần đây. Trong trường hợp đó, tùy thuộc vào nhà phát triển mô-đun nói trên để tìm vị trí lỗi.
Vic

Các distinct()giải pháp và điều này sẽ loại bỏ bất cứ hồ sơ bổ sung từ các truy vấn, mà có nghĩa là bạn có thể bị mất dữ liệu mà không nhận thấy. Vì vậy, đây có thể không phải là giải pháp tốt nhất, như trong trường hợp của tôi. Bây giờ tôi đang cố gắng tìm cách đưa cả hai bản ghi từ bảng đã tham gia của mình vào bộ sưu tập để tôi có thể hiển thị cả hai bản ghi trên cùng một hàng trong lưới.
Jacques

Lưu ý nhỏ: nhập khẩu để không xâu chuỗi này vào bộ sưu tập, nhưng furst đưa colelction của bạn vào một biến và hơn là làm bộ sưu tập $-> getSelect () -> nhóm ('e.entity_id');
Rickert

Tôi có thể cập nhật mã này ở đâu?
zus

7

Thông thường, đây là một lỗi trong dữ liệu hoặc trong quá trình thực hiện bộ sưu tập.

Đây là một giải pháp cho một vấn đề rộng lớn hơn. Điều này hoạt động trên bộ sưu tập tùy ý, không chỉ cho Catalog_Model_Product.

Bước 1. Sửa file lõi lib/Varien/Data/Collection.php, function addItem()nhưng không giống như câu trả lời này cho thấy, không che giấu lỗi.

Thay vào đó, hãy thêm thông tin lỗi vào ngoại lệ được ném:

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

Bước 2. Lấy truy vấn vi phạm từ báo cáo lỗi của bạn và chạy bằng tay. Xem những gì hồ sơ trùng lặp khóa bộ sưu tập. Thêm order by <key field>khi cần thiết.

Phân tích từng truy vấn loại bỏ từng bảng tham gia và xem bản ghi nào gây ra sự trùng lặp.

Tôi tin rằng bản vá này nên ở trong lõi.


3

Vấn đề của bạn là bạn có một bộ sưu tập (có thể có sự tham gia hoặc liên minh) dẫn đến việc cùng một sản phẩm được tải vào bộ sưu tập hai lần.

Bạn có thể thay đổi bộ sưu tập đang được tải bằng cách thêm một phương thức riêng biệt vào đối tượng được chọn.

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

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

Nhưng điều này đi kèm với các vấn đề cố hữu. Sử dụng riêng biệt sẽ khiến các bảng tạm thời được tạo trên đĩa, không phải trong bộ nhớ, đi kèm với các hình phạt về hiệu suất.


0

Trong trường hợp của tôi

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

không hoạt động tôi sử dụng:

->getSelect()->group('main_table.entity_id');

Mat cũng rất đáng ghét

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.