Danh sách sản phẩm Truy vấn bộ lọc thuộc tính


12

Tôi đã thêm một bộ lọc trong Phương thức _getProductCollection() của lớp Mage_Catalog_Block_Product_List như sau.

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection->getSelect()->joinInner(
        array('cpe' => 'catalog_product_entity'),
        'e.entity_id = cpe.entity_id'
    ) 
    ->where("cpe.type_id = 'simple'"); 
    ...
}

Đoạn mã trên đang hoạt động tốt kể từ Magento Phiên bản 1.7. Nhưng bất cứ khi nào tôi viết đoạn mã sau, nó sẽ cho

Không tìm thấy cột: 1054 Cột không xác định 'e.type_id' trong 'mệnh đề where'

lỗi.

Mã (không hoạt động).

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection
        ->addAttributeToSelect('type_id')
        ->addAttributeToFilter('type_id','simple');
    ...
}

Bây giờ là câu hỏi .

  1. Sẽ có bất kỳ tác động hiệu suất nếu tôi sử dụng mã làm việc đầu tiên?
  2. Có cách nào khác để có được một bộ lọc sản phẩm phù hợp không?

CẬP NHẬT:

Bất cứ khi nào tôi áp dụng mã sau đây và sử dụng rwdchủ đề, tôi không nhận được bất kỳ lỗi nào. Nhưng bất cứ khi nào tôi sử dụng defaultchủ đề, tôi nhận được lỗi dưới đây,

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection
         ->addAttributeToSelect('type_id')
         ->addAttributeToFilter('type_id','simple');
    ...
}

lỗi

SQLSTATE [42S22]: Không tìm thấy cột: 1054 Cột không xác định 'e.type_id' trong 'mệnh đề where', truy vấn là: CHỌN FLOOR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 AS range, COUNT (*) AS countTỪ catalog_product_index_priceAS e INNER JOIN catalog_category_product_indexAS cat_indexON cat_index.product_id = e.entity_id VÀ cat_index.store_id = 1 AND cat_index.visibility IN (2, 4) VÀ cat_index.category_id = '3' WHERE ( e. type_idIN ( 'đơn giản' )) AND (e.website_id = '1') AND (e.customer_group_id = 0) VÀ (e.min_price KHÔNG PHẢI LÀ NHÓM THEO FLOOR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 ĐẶT HÀNG B FLNG SÀN ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 ASC


bạn đã sử dụng phiên bản magento nào ?? * & đã áp dụng các bản vá magento
Amit Bera

1
wtf? bây giờ có ý nghĩa ... tôi đã thử qua EE 1.14 trên RWD, điều đó không thể chấp nhận được, làm thế nào một chủ đề xem có thể thay đổi toàn bộ truy vấn thậm chí tệ nhất làm sao có thể thay đổi bảng chính ... đây không thể là bất cứ điều gì ngoài lỗi . Làm tốt lắm @Magento Người học!
MauroNigrele

Chính xác, chủ đề xem tạo ra vấn đề. cảm ơn. Mã phải độc lập với một chủ đề
Magento Learner

Câu trả lời:


0

Tôi nghĩ vậy:

$collection->addAttributeToFilter('type_id', array('eq' => 'simple');

Nếu hoạt động, bạn không cần thêm type_idvàoselect vì đó là một catalog_product_entitycột và nó được truy xuất theo mặc định. Tôi luôn đề nghị ghi nhật ký truy vấn cuối cùng để có ý tưởng tốt nhất về những gì đang xảy ra:

Mage.:log($collection->getSelectSql(true));

BTW: Khối mã đầu tiên hoàn toàn không có ý nghĩa gì vì bạn đang tham gia bảng chính ( catalog_product_entity) vào chính nó.


"trong Magento 1.7 họ đã tối ưu hóa trên sql chọn được sử dụng cho các tùy chọn lọc giá. Họ loại bỏ phần TỪ sql (là thực thể sản phẩm - chứa thuộc tính type_id) và biến bảng liên quan price_index thành bảng chính - một được sử dụng trong phần TỪ của truy vấn. Vì vậy, về cơ bản bảng mà dữ liệu được chọn không còn là bảng thực thể sản phẩm nữa (bạn mất tất cả các thuộc tính cơ sở của sản phẩm), bảng chính trở thành chỉ mục sản phẩm. Đây là bản cập nhật cốt lõi. nhóm Magento đã thêm phiên bản 1.7 bắt đầu. " Tham khảo các mục sau
Học viên Magento


1
Vì lý do lỗi dân gian của tôi, vì một số lý do, tôi đã suy nghĩ trong phương pháp getCollection khối phụ trợ, vì vậy trong kịch bản này, mã đầu tiên của bạn, tôi không chắc đó có phải là giải pháp tốt nhất nhưng có vẻ ổn. Xin lỗi
MauroNigrele

@MagentoLearner bạn có chắc về bài đăng đó không? Tôi vừa kiểm tra lại trên EE1,14 tôi đã cài đặt và vẫn sử dụng catalog_product_entity làm bảng chính, ngoại trừ khi bạn đặt sử dụng danh mục phẳng (hoàn toàn được khuyến nghị) nhưng trong cả hai trường hợp bạn đều có type_id trong phần chọn. Bạn có thể đăng nhập truy vấn như tôi đã viết trong Câu trả lời ban đầu không?
MauroNigrele

1
mmmm thú vị ... tôi cũng kiểm tra truy vấn trong trường hợp tìm kiếm và đang sử dụng catalog_product_entity làm bảng chính, có thể "nhóm magento" đã quyết định quay ngược lại những thay đổi đó. Tôi không thể tìm thấy bất kỳ 1.7 nào được cài đặt để kiểm tra nhưng ý tưởng thay đổi bảng chính của một thực thể nghe có vẻ như là một quyết định kiến ​​trúc rất tệ ... Xin lưu ý rằng bạn vừa phá hỏng cuối tuần của tôi, bây giờ tôi cần tìm và cài đặt CE1 .7 và nhìn cái
thứ nhảm nhí
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.