Magento 2: Bộ sưu tập sản phẩm theo nhiều danh mục (Magento 2.1)


9

Tôi đang sử dụng Magento 2.1.0 và hiện tôi đang gặp khó khăn trong việc lọc bộ sưu tập sản phẩm với nhiều danh mục. Tôi đã sử dụng nhiều hơn một vài cách để làm cho nó hoạt động nhưng nó sẽ không.

Giả định:

$catalog_ids = [618, 619, 620];
  1. Trả về NULL

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addCategoriesFilter(array('in' => $catalog_ids));
    
  2. Trả về ngoại lệ: Tên thuộc tính không hợp lệ: category_id

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_id', array(
            'finset' => $catalog_ids
        ));
    
  3. Trả về Lỗi cú pháp hoặc vi phạm truy cập

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_ids', array(
            'finset' => $catalog_ids
        ));
    

Bất kỳ lời khuyên về làm thế nào tôi có thể có công việc này hoặc có một cái gì đó liên kết công việc này?


Hãy thử kiểm tra sql được tạo. $ ProductCollection-> getSelectSql (đúng);
Arkadii Chyzhov

Câu trả lời:


12

Có lẽ bạn đã quen với $thismô hình "mọi phương thức trả về " từ Magento 1. Đây không phải là trường hợp nữa (ít nhất là không phải lúc nào cũng vậy).

Cụ thể, addCategoriesFilter()không trả lại bất cứ điều gì và đó là lý do tại sao bạn nhận được null.

Thay đổi mã thành:

$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('*');
$productCollection->addCategoriesFilter(array('in' => $catalog_ids));

3
Để đề xuất rằng nó không phải là trường hợp nữa có lẽ được nêu quá mạnh mẽ. Hàm 'addC CategoryFilter' (số ít) trong cùng một lớp sẽ trả về $ this; do đó, việc thêm giá trị trả về trong 'addC loạiFilter' có lẽ đã thoát khỏi sự chú ý của nhà phát triển.
Patrick van Bergen

vâng, điều đó cũng có ý nghĩa
Fabian Schmengler

2

Lần thử đầu tiên của bạn chắc chắn là cách làm đúng:

$values = [318, 619, 620];
$conditionType = "in";
$productCollection->addCategoriesFilter([$conditionType => $values]);

Bây giờ có hai điều cần đảm bảo: $productCollectionphải là một ví dụ Magento\Catalog\Model\ResourceModel\Product\Collectionđể làm việc này (hoặc từ một lớp mở rộng nó).

Và rõ ràng bạn cần phải có các sản phẩm trong catalog_category_productbảng phù hợp với điều kiện đó, có thể đó không phải là trường hợp và đó là lý do tại sao bạn nhận được NULL.


Đó là cách tốt hơn để sử dụng bộ sưu tập sản phẩm hoặc sử dụng hợp đồng dịch vụ? Magento \ Catalog \ Api \ Data \ ProductSearchResultsInterface
MagePologistso

@MagePologistso nếu bạn luôn có sự lựa chọn cho các hợp đồng dịch vụ;)
Raphael tại Digital Pianism
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.