Magento 2: Cách lọc bộ sưu tập sản phẩm theo ID cửa hàng


11

Sử dụng một đối tượng nhà máy sản phẩm, tôi có thể tạo một sản phẩm, lấy một bộ sưu tập sản phẩm và lấy mục đầu tiên của bộ sưu tập đó

/* var $productFactory \Magento\Catalog\Model\ProductFactory */
$product = $this->productFactory->create()->getCollection()->getFirstItem();

Tuy nhiên, nếu tôi cố gắng thêm store_id vào bộ lọc của bộ sưu tập

    $product = $this->productFactory
        ->create()
        ->getCollection()
        ->addFieldToFilter('store_id', 1)
        ->getFirstItem();

Tôi nhận được lỗi sau đây

Invalid attribute name: store_id
#0 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(1434): Magento\Eav\Model\Entity\Collection\AbstractCollection->_addAttributeJoin('store_id', 'inner')
#1 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(359): Magento\Eav\Model\Entity\Collection\AbstractCollection->_getAttributeConditionSql('store_id', 1, 'inner')
#2 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Catalog/Model/Resource/Product/Collection.php(1489): Magento\Eav\Model\Entity\Collection\AbstractCollection->addAttributeToFilter('store_id', 1, 'inner')
#3 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(382): Magento\Catalog\Model\Resource\Product\Collection->addAttributeToFilter('store_id', 1)
...
#63 {main}

Điều tương tự cũng xảy ra nếu tôi cố gắng sử dụng kho lưu trữ sản phẩm để lọc theo store_id (kho lưu trữ sử dụng các bộ sưu tập dưới mui xe).

Đây có phải là một lỗi? Hoặc các mối quan hệ giữa các cửa hàng, trang web và sản phẩm đã thay đổi trong Magento 2 sao cho đây không còn là truy vấn hợp pháp? Cả hai? Cũng không? Thứ gì khác?


Tôi rất mới với M2, nhưng bạn không thể sử dụng github.com/magento/magento2/blob/develop/app/code/Magento/ này ?
fmrng

@fnng Sử dụng phương pháp để biết, nhưng tôi muốn nói "vui lòng lấy cho tôi danh sách tất cả các sản phẩm là một phần của cửa hàng X". Không chắc cách setStoreId sẽ làm điều đó.
Alan Storm

Câu trả lời:


4

Bạn có thể làm điều này với phương thức addStoreFilter(), xemMagento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()

các addStoreFilter()chức năng sẽ chấp nhận cửa hàng ID hoặc Stoređối tượng như một tham số.

EG, để có được tất cả các sản phẩm cho các cửa hàng hiện tại :

public function getProducts(){
    return $this->collection->addStoreFilter($this->_storeManager->getStore()); 
}

Hy vọng, điều này sẽ giúp.


Cảm ơn @amitbeta! Nếu bạn có thời gian - bạn có biết liệu có thể tạo bộ lọc cửa hàng bằng cách sử dụng kho sản phẩm không? magento.stackexchange.com/questions/91278/ Mạnh
Alan Storm

chắc chắn .. tôi sẽ xem xét
Amit Bera

@AmitBera, Xin vui lòng bạn có thể giải thích một chút về cách sử dụng addStoreFilter () vào bộ sưu tập sản phẩm.

5

Bây giờ điều này trông giống như một lỗi, bởi vì không có khả năng áp dụng bộ lọc cửa hàng với ProductRepository::getList()phương thức, chuyển id cửa hàng dưới dạng bộ lọc của SearchCriteria .

Trong triển khai getList, bạn có thể thấy rằng tất cả các bộ lọc từ SearchCriteria được áp dụng cho bộ sưu tập

    foreach ($searchCriteria->getFilterGroups() as $group) {
        $this->addFilterGroupToCollection($group, $collection);
    }

Trong Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectionđó có xử lý đặc biệt cho bộ lọc Danh mục , nhưng không có ai cho Cửa hàng.

Vì vậy, cần thêm điều kiện bổ sung để Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectionkiểm tra xem chúng tôi có bộ lọc cửa hàng hay không và nếu chúng tôi có - đặt id cửa hàng cho bộ sưu tập, đại loại như:

        if ($filter->getField() == \Magento\Catalog\Model\Product::STORE_ID) {
            $collection->setStore($filter->getValue());
            continue;
        }

Đã tạo lỗi nội bộ cho vấn đề này, số của nó là MAGETWO-45950


Có tin tức gì về điều đó không? Tôi không thể tìm thấy tài liệu tham khảo về số vé trên Github.
Fabian Schmengler

1
Trong Magento 2 sản phẩm được gán cho Trang web, không phải cho Cửa hàng. Vì vậy, hành vi ban đầu được mô tả bởi Alan là chính xác, vì thực thể Sản phẩm không có liên kết Id cửa hàng, chỉ liên kết đến Id trang web. Và vé nội bộ là về việc giới thiệu thuộc tính Tiện ích mở rộng với ProductWebsiteLinkInterface vào ProductInterface
Igor Minyaylo

Bên cạnh liên kết cửa hàng / trang web, bạn setStore()cũng không chỉ định giá trị thuộc tính cửa hàng cụ thể nào được tìm nạp? Hay điều này được thực hiện theo một cách khác bây giờ?
Fabian Schmengler

Có các phương thức setStoreId / getStoreId trong triển khai mô hình Sản phẩm, nhưng không có phương thức nào trong ProductInterface, vì vậy không nên dựa vào chúng trong logic kinh doanh của bạn.
Igor Minyaylo

Hiện tại, việc giải quyết các giá trị cấp độ StoreView (ví dụ: nội địa hóa các thuộc tính) được tạo bởi phần URL StoreID trong API REST
Igor Minyaylo

0

Nếu bạn sử dụng mô hình tùy chỉnh với một số bảng, hãy thêm tên_bảng như: addFieldToFilter('**table_name.**column_name', 1)


Bạn có thể vui lòng chia sẻ toàn bộ đoạn mã để tải bộ sưu tập sản phẩm từ cột của tôi nói id thực thể, như bạn đã nói ở trên
Sushivam

0

1) Lớp là \Magento\Catalog\Model\ResourceModel\Category\Collection:

/** @var \Magento\Catalog\Model\ResourceModel\Category\Collection $collection */
$collection = $this->categoryFactory->create()->getCollection()
        ->addFieldToSelect('*');

2) Sau đó, phương thức là $collection->setStoreId(0);


PS thay vì 0, bạn có thể đặt id cửa hàng của mình 1, 2, ...
Giedrius Tumelis 15/03/2017

Meta: Vì một số lý do, biểu tượng ngôi sao đã bị xóa khỏi tin nhắn của tôi ở đây.
Giedrius Tumelis
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.