Lý do câu trả lời ColinM của công trình là do các mã trong app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
's addAttributeToFilter
phương pháp. Nếu bạn sử dụng định dạng mảng này, nó không gọi addAttributeToSelect
. Trong chế độ phẳng, addAttributeToSelect
âm thầm thất bại nếu thuộc tính không nằm trong bảng phẳng.
(dưới đây là một tái băm của câu trả lời của tôi trên /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - Tôi không chắc chắn về nghi thức đó là gì nhưng biết rằng tôi sẽ thấy nó hữu ích)
Tôi muốn một giải pháp "sạch" cho bộ sưu tập chế độ phẳng chọn và lọc trên các thuộc tính không phẳng, trong đó:
- không yêu cầu thuộc tính phải có cài đặt cụ thể trong quản trị viên (có thể được thêm bởi người dùng hoặc ẩn ở mặt trước)
- hoạt động cho cả chế độ phẳng và không phẳng
Tôi đã sử dụng bộ sưu tập sản phẩm liên quan, nhưng điều này áp dụng cho bất kỳ bộ sưu tập EAV nào.
Mã không thành công:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
->addAttributeToFilter( 'my_custom_attribute', 3 )
;
Trong chế độ phẳng, đoạn mã trên âm thầm không thể chọn hoặc lọc trên thuộc tính nếu nó không nằm trong bảng phẳng.
Thêm vào lựa chọn:
$_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' )
;
Các joinAttribute
phương pháp thêm một tham gia vào truy vấn cho thuộc tính cụ thể được yêu cầu. Nó vẫn hoạt động khi thuộc tính đã có trong bảng phẳng, nhưng sẽ kém hiệu quả hơn một chút so với sử dụng hoàn toàn bảng phẳng.
Tôi đã sử dụng một left
tham gia ở đó, để đảm bảo rằng nó tìm nạp các sản phẩm nếu my_custom_attribute
không được đặt trên các sản phẩm đó. Thay đổi điều đó inner
nếu bạn chỉ quan tâm đến các hàng my_custom_attribute
được đặt.
Thêm vào bộ lọc (theo ColinM ở trên):
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;
Đoạn mã trên sẽ thêm nó vào phần chọn cũng như tuân theo bộ lọc của bạn.
(được thử nghiệm trong CE 1.6.2.0)
non-flat attribute
gì? Cảm ơn .và đừng làm cho magento trở nên khó hiểu. Điều đó thật khó hiểu