마 젠토 2 : 상점 ID별로 제품 콜렉션을 필터링하는 방법


11

제품 팩토리 객체를 사용하여 제품을 만들고 제품 컬렉션을 잡고 해당 컬렉션의 첫 번째 항목을 가져올 수 있습니다.

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

그러나 컬렉션의 필터에 store_id를 추가하려고하면

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

다음과 같은 오류가 발생합니다

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}

store_id를 기준으로 필터링하기 위해 제품 저장소를 사용하려고 할 때도 마찬가지입니다 (저장소는 후드 아래의 컬렉션을 사용합니다).

이것이 버그입니까? 또는 Magento 2에서 상점, 웹 사이트 및 제품 간의 관계가 더 이상 합법적 인 쿼리가 아니도록 변경 되었습니까? 양자 모두? 둘 다요? 다른 것?


M2를 처음 접 했지만이 github.com/magento/magento2/blob/develop/app/code/Magento/… 를 사용할 수 없습니다 .
fmrng

@fnng 알고있는 방법을 사용하되 "Store X의 일부인 모든 제품 목록을 알려주세요"라고 말하고 싶습니다. setStoreId가 어떻게하는지 잘 모르겠습니다.
Alan Storm

답변:


4

당신은 방법으로이 작업을 수행 할 수 있습니다 addStoreFilter()참조Magento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()

addStoreFilter()함수는 상점 ID 또는 Store오브젝트를 매개 변수로 승인 합니다.

EG, 현재 상점의 모든 제품을 얻으려면 다음을 수행하십시오 .

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

바라건대, 이것이 도움이됩니다.


감사합니다 @ amitbeta! 순간이 있다면 — 제품 리포지토리를 사용하여 상점 필터를 생성 할 수 있는지 알고 있습니까? magento.stackexchange.com/questions/91278/…
Alan Storm

확실한 .. 내가 볼 것이다
Amit Bera

@AmitBera, 제품 콜렉션에 addStoreFilter ()를 사용하는 방법을 조금 설명해주세요.

5

지금은 버그로 보입니다. ProductRepository::getList()메소드 와 함께 상점 필터를 적용 할 가능성이 없기 때문에 상점 ID를 SearchCriteria 의 필터로 전달 합니다.

getList 구현에서 SearchCriteria의 모든 필터가 콜렉션에 적용됨을 찾을 수 있습니다.

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

Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection대한 특별 취급이 카테고리 필터는 하지만, 스토어 아무도 없다.

따라서 Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection저장소 필터가 있는지 여부를 확인하고 컬렉션에 대해 저장소 ID를 설정 한 경우 다음과 같은 추가 조건을 추가해야합니다 .

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

이 문제에 대한 내부 버그가 생성되었으며 그 수는 MAGETWO-45950입니다.


그것에 대한 뉴스가 있습니까? Github에서 티켓 번호에 대한 참조를 찾을 수 없습니다.
Fabian Schmengler 2016 년

1
Magento 2 제품은 상점이 아닌 웹 사이트에 할당됩니다. 따라서 제품 엔터티에 Store Id 링크가없고 웹 사이트 Id 링크 만 있기 때문에 Alan이 설명하는 초기 동작이 올바른 것입니다. 그리고 내부 티켓은 ProductWebsiteLinkInterface와 함께 확장 속성을 ProductInterface에 도입하는 것에 관한 것입니다
Igor Minyaylo

상점 / 웹 사이트 연결 외에도 setStore()가져올 상점 특정 속성 값을 지정 하지 않습니까? 아니면 지금 다른 방식으로 이루어 집니까?
Fabian Schmengler 2016 년

제품 모델 구현에는 setStoreId / getStoreId 메소드가 있지만 ProductInterface에는 메소드가 없으므로 비즈니스 로직에 의존하지 않는 것이 좋습니다.
Igor Minyaylo

REST API에서 StoreID URL 부분으로 작성된 StoreView 레벨 값 (예 : 속성의 현지화)을 해결하려면
Igor Minyaylo

0

여러 테이블과 함께 사용자 정의 모델을 사용하는 경우 다음과 같이 table_name을 추가하십시오. addFieldToFilter('**table_name.**column_name', 1)


위에서 언급 한 것처럼 내 열에서 제품 컬렉션을로드하기위한 전체 스 니펫을 엔터티 ID라고 말해 주
시겠습니까?

0

1) 수업은 \Magento\Catalog\Model\ResourceModel\Category\Collection:

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

2) 그런 다음 방법은 $collection->setStoreId(0);


PS 대신에 당신은 당신의 상점 id 1, 2, ...을 넣을 수 있습니다.
Giedrius Tumelis

메타 : 어떤 이유로 든 별표가 여기 메시지에서 제거되었습니다.
Giedrius Tumelis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.