Magento 2: วิธีกรองคอลเลคชั่นผลิตภัณฑ์ตามรหัสร้านค้า


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 ใช้วิธีการที่จะรู้ แต่ฉันต้องการจะพูดว่า "ได้รับรายชื่อของผลิตภัณฑ์ทั้งหมดที่เป็นส่วนหนึ่งของร้าน X" ไม่แน่ใจว่า setStoreId จะทำเช่นนั้นได้อย่างไร
อลันสตอร์ม

คำตอบ:


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/…
อลันสตอร์ม

แน่นอน .. ฉันจะดู
Amit Bera

@AmitBera, คุณช่วยอธิบายเล็กน้อยเกี่ยวกับวิธีใช้ addStoreFilter () เพื่อรวบรวมผลิตภัณฑ์

5

สำหรับตอนนี้ลักษณะเช่นนี้ข้อผิดพลาดเพราะไม่มีความเป็นไปได้ที่จะใช้ตัวกรองร้านด้วยProductRepository::getList()วิธีการผ่านรหัสร้านค้าเป็นตัวกรองของ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
เฟเบียน Schmengler

1
ในผลิตภัณฑ์วีโอไอพี 2 นั้นถูกกำหนดให้กับเว็บไซต์ไม่ใช่ไปที่ร้านค้า ดังนั้นพฤติกรรมเริ่มต้นที่อธิบายโดย Alan ถูกต้องเนื่องจากเอนทิตีผลิตภัณฑ์ไม่มีลิงก์รหัสร้านค้าเพียงแค่เชื่อมโยงไปยังรหัสเว็บไซต์ และตั๋วภายในเป็นเรื่องเกี่ยวกับการเปิดตัวคุณลักษณะส่วนขยายด้วย ProductWebsiteLinkInterface เข้าสู่ ProductInterface
Igor Minyaylo

นอกจากการเชื่อมโยงร้านค้า / เว็บไซต์แล้วยังไม่ได้setStore()ระบุค่าแอททริบิวที่เฉพาะเจาะจงของร้านค้าที่ดึงมา หรือจะทำในวิธีที่แตกต่างกันตอนนี้?
เฟเบียน Schmengler

มีเมธอด setStoreId / getStoreId ในการนำโมเดลผลิตภัณฑ์ไปใช้ แต่ไม่มีวิธีใดใน ProductInterface ดังนั้นจึงไม่แนะนำให้ใช้มันในตรรกะทางธุรกิจของคุณ
Igor Minyaylo

สำหรับการแก้ไขค่าระดับ
StoreView ใน

0

หากคุณใช้โมเดลที่กำหนดเองที่มีหลายตารางให้เพิ่ม table_name เช่น: addFieldToFilter('**table_name.**column_name', 1)


คุณช่วยแบ่งปันตัวอย่างทั้งหมดเพื่อโหลดคอลเลกชันผลิตภัณฑ์จากคอลัมน์ของฉันว่ารหัสเอนทิตีตามที่คุณได้กล่าวไว้ข้างต้น
Sushivam

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 แทน 0 คุณสามารถใส่รหัสร้านค้า 1, 2, ...
Giedrius Tumelis

Meta: ด้วยเหตุผลบางประการสัญลักษณ์รูปดาวก็ถูกลบออกจากข้อความของฉันที่นี่
Giedrius Tumelis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.