เหตุผลคำตอบ ColinM ทำงานเป็นเพราะรหัสในapp/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
'saddAttributeToFilter
วิธี หากคุณใช้รูปแบบอาร์เรย์นี้จะไม่เรียกaddAttributeToSelect
ใช้ ในโหมดaddAttributeToSelect
แฟล็ตจะล้มเหลวแบบไม่โต้ตอบหากแอ็ตทริบิวต์ไม่ได้อยู่ในตารางแบน
(ด้านล่างคือแฮชอีกครั้งของคำตอบของฉันเมื่อ /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - ฉัน ไม่แน่ใจว่ามารยาทสำหรับสิ่งนั้น แต่รู้ว่าฉันจะพบว่ามันมีประโยชน์)
ฉันต้องการโซลูชันที่ "สะอาด" สำหรับการเลือกและการกรองในโหมดแบนสำหรับแอตทริบิวต์ที่ไม่ใช่แบบแบนซึ่ง:
- ไม่จำเป็นต้องให้แอททริบิวมีการตั้งค่าเฉพาะในผู้ดูแลระบบ (อาจเพิ่มโดยผู้ใช้หรือซ่อนไว้ที่ส่วนหน้า)
- ใช้งานได้ทั้งโหมดแบนและไม่แบน
ฉันใช้คอลเล็กชันผลิตภัณฑ์ที่เกี่ยวข้อง แต่สิ่งนี้ใช้ได้กับการรวบรวม EAV ใด ๆ
รหัสล้มเหลว:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
->addAttributeToFilter( 'my_custom_attribute', 3 )
;
ในโหมดแฟล็ตรหัสด้านบนจะล้มเหลวในการเลือกหรือกรองแอททริบิวต์หากไม่เกิดขึ้นในตารางแฟล็ต
การเพิ่มไปยังตัวเลือก:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->joinAttribute( 'my_custom_attribute', 'catalog_product/my_custom_attribute', 'entity_id', null, 'left' )
->addAttributeToSelect( 'my_custom_attribute' )
;
joinAttribute
วิธีเพิ่มเข้าร่วมในแบบสอบถามสำหรับแอตทริบิวต์เฉพาะที่มีการร้องขอ มันยังคงใช้งานได้เมื่อแอตทริบิวต์อยู่ในตารางแบนแล้ว แต่จะมีประสิทธิภาพน้อยกว่าการใช้ตารางแบนเพียงเล็กน้อย
ฉันใช้การleft
เข้าร่วมที่นั่นเพื่อให้แน่ใจว่าจะได้รับผลิตภัณฑ์หากmy_custom_attribute
ไม่ได้ตั้งค่าไว้ในผลิตภัณฑ์เหล่านั้น เปลี่ยนค่านี้inner
หากคุณสนใจเฉพาะแถวที่my_custom_attribute
ตั้งค่าไว้
การเพิ่มไปยังตัวกรอง (ตาม ColinM ด้านบน):
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;
โค้ดด้านบนจะเพิ่มเข้าไปในตัวเลือกรวมถึงการเชื่อฟังตัวกรองของคุณ
(ทดสอบใน CE 1.6.2.0)
non-flat attribute
อะไร ขอบคุณ. และอย่าทำให้วีโอไอพีสับสนเพราะมันสับสนอยู่แล้ว